شرح تحديث شجرة الحسابات JTree من قاعدة البيانات

استعرض الموضوع السابق استعرض الموضوع التالي اذهب الى الأسفل

شرح تحديث شجرة الحسابات JTree من قاعدة البيانات

مُساهمة من طرف tampolla في الإثنين فبراير 15, 2016 8:58 am

السلام عليكم
هذه أول مشاركة لي في هذا المنتدى العظيم
وحيث أنني أستفدت الكثير وتعلمت الكثير من خلال الأفاضل الموجودين هنا أردت المساعدة في شرح جزء بحثت عنه لمدة ثلاثة أيام وتوصلت له اﻵن بعد عناء والحمد لله
يمكن أن يكون الكود ليس بالشكل اﻹحترافي حيث أنني مازلت مبتدئ إﻻ انه إن شاء الله سيفي بالغرض وسيوفر على كثيرين عناء البحث بدون جدوى
أسأل الله ان يجعله صدقة جارية ﻷمي

بسم الله نبدأ
شرح مختصر أوﻻً للمطلوب
عندي جدول بقاعدة البيانات يحتوي على أسماء الحسابات وأرقام الحسابات الرئيسية والفرعية بالشكل التالي:

قاعدة البيانات


وأريد أن أعرضها في شكل شجرة لتسهيل عرضها على المستخدم كما هو مبين بالشكل التالي:

شجرة الحسابات


سأبدأ أوﻻً في فكرة إنشاء الشجرة بدون قاعدة بيانات حتى يكون من اليسير فهم إضافة قاعدة البيانات بعد ذلك:

ﻹنشاء شجرة داخل جافا يجب أن يكون لدينا عقدة جذرية Root Node والتي سوف يتفرع منها بدورها عقد فرعية Children Nodes يمكنها أن تتفرع بعد ذلك إلى ما شاء الله


ﻹنشاء الشجرة نحتاج إلى إنشاء عقدة جذرية باﻷمر التالي
الرمز:
DefaultMutableTreeNode rootNode = new DefaultMutableTreeNode("I'm Root");

ثم ننشيء عقد فرعية من العقدة الجذرية بنفس الكود

الرمز:
DefaultMutableTreeNode childOne = new DefaultMutableTreeNode("I'm a Child # One");


الرمز:
DefaultMutableTreeNode childTwo = new DefaultMutableTreeNode("I'm a Child # Two");

ولكن كيف ستفهم جافا بالعلاقة بين العقدة الجذرية والفرعية؟؟
سنشرح لها بالطبع
ببساطة سنضيف العقدة الفرعية إلى الجذرية

الرمز:
rootNode.add(childOne);
الرمز:
rootNode.add(childTwo);

ثم نضيف العقدة الجذرية إلى الشجرة باﻷمر التالي

الرمز:
DefaultTreeModel dtm = new DefaultTreeModel(rootNode);

وبعدها نظهر الشجرة إلى الشاشة

الرمز:
jTree1.setModel(dtm);

بالطبع ﻻ تنسى إستيرااد المكتبات التالية
الرمز:
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;

يكون الناتج كالتالي

ناتج ما سبق

إذا أردت مثلا تفريع childOne سنتبع نفس الخطوات
تعريف الفرع
الرمز:
DefaultMutableTreeNode childOfchildOne = new DefaultMutableTreeNode("I'm a Child of Child One");


ثم إضافة الفرع اﻷخير إلى الفرع الذي أصبح أبوه اﻵن
الرمز:
childOne.add(childOfchildOne);

يكون الناتج كالتالي

ناتج ما سبق

هذا شرح بسيط لنموذج الشجرة غير الديناميكي
أرجو أن يكون واضح للجميع
سوف أدرج اﻵن الكود الذي توصلت إليه مع وضع الشرح كتعليق على كل جزء وفي حالة وجود أي غموض بالموضوع فلا تتردد في السؤال
دعواتكم لي وﻷمي وأبي

الرمز:
    Connection con = null;
    PreparedStatement pst = null;
    ResultSet rs = null;

   public AccountsJTree() {
        initComponents();
        con = DBConnection.iconnect();
        this.fillTree();
    }
    
    
    public void fillTree(){
    
            try {
            
            String query = "Select accountNumber,accountName,higherAccount from MainAccounts";
            pst = con.prepareStatement(query);
            rs = pst.executeQuery();
            

            int rowCount = 0; //سوف نستخدمه لمعرفة عدد النتائج او الصفوف في قاعدة البيانات
            int i = 0;   // سوف نستخدمه لمقارنة عمود الحساب اﻷب بعمود الحساب اﻷبن
            int j = 0;   // سوف نستخدمه لمقارنة عمود الحساب اﻷب بعمود الحساب اﻷبن
            
            // الدوران لمعرفة عدد الصفوف
            while(rs.next()){
            rowCount++;
            }
            //بعد الدوران سيصبح مؤشر
            //rs
            //خالي لذا يجب أن نعيد اﻹستعلام
            rs = pst.executeQuery();
            
            //اوﻻ نعرف العقدة الرئيسية في الشجرة ونسميها شجرة الحسابات
            DefaultMutableTreeNode rootNode = new DefaultMutableTreeNode("شجرة الحسابات");
            
            //المطلوب مننا ان نقارن عمود الحساب اﻷب برقم الحساب لقاعدة البيانات
            //ولعمل لذلك ننشيء ثلاث مصفوفات
            //المصفوفة الاولى تحتوي على جميع أرقام الحسابات
            String[] nodeID = new String[rowCount];
            
            //المصفوفة الثانية تحتوي على أرقام الحسابات اﻷب
            String[] parentID = new String[rowCount];
            
            //المصفوفة الثالثة تحتوي على العقدالفرعية و التي سيتم ربطها مع عقدة  شجرة الحسابات الرئيسية
            DefaultMutableTreeNode[] node = new DefaultMutableTreeNode[rowCount];
            
            
            
            //نبدأ الدوران لتعبئة الشجرة
            while(rs.next()){
            
                //أوﻻ نعبئ الثلاث مصفوفات
                node[i] = new DefaultMutableTreeNode(rs.getString("accountName"));
                parentID[i] = rs.getString("higherAccount");
                nodeID[i]= rs.getString("accountNumber");
                
                //إذا كان الحساب اﻷب يساوي صفر أي انه يتبع مباشرة العقدة الجذرية
                //rootNode
               if(parentID[i].equals("0")){
               rootNode.add(node[i]);    
               }
                i++;              
            }
            
            //أهم خطوة سوف نقارن كل رقم حساب بخانةالحساب اﻷعلى مع رقم الحساب اﻷصلي
            // وذلك عن طريق دورانين
            //في حال التساوي نلحق العقدة الفرعية بالعقدة اﻷب
            for (i = 0; i < rowCount; i++) {

                for (j = 0; j < rowCount; j++) {

                    if (!"0".equals(node[i]) && parentID[j].equals(nodeID[i])) {

                        node[i].add(node[j]);

                    }
 

                }

            }
            
            //أخيرا نضيف العقدة الجذرية إلى الشجرة
            
            DefaultTreeModel dtm = new DefaultTreeModel(rootNode);
            
            //ثم نظهر الشجرة على الشاشة
            jTree1.setModel(dtm);
  
        } catch (SQLException ex) {
            Logger.getLogger(AccountsJTree.class.getName()).log(Level.SEVERE, null, ex);
        } finally {

            try {
                pst.close();
                rs.close();
            } catch (SQLException ex) {
                Logger.getLogger(AccountsJTree.class.getName()).log(Level.SEVERE, null, ex);
            }

            }    
    
    }

tampolla
..
..

تاريخ التسجيل : 12/08/2015
المساهمات : 10
النقاط : 12
التقيم : 0
الدولة : مصر
الجنس : ذكر

الرجوع الى أعلى الصفحة اذهب الى الأسفل

رد: شرح تحديث شجرة الحسابات JTree من قاعدة البيانات

مُساهمة من طرف NEXT في الإثنين فبراير 15, 2016 9:42 pm

جزاكم الله خيرا يا اخى

NEXT
الادارة
الادارة

تاريخ التسجيل : 18/02/2011
المساهمات : 262
النقاط : 378
التقيم : 10
الجنس : ذكر

الرجوع الى أعلى الصفحة اذهب الى الأسفل

رد: شرح تحديث شجرة الحسابات JTree من قاعدة البيانات

مُساهمة من طرف زهراء في الإثنين فبراير 15, 2016 9:55 pm

tampolla كتب:السلام عليكم
هذه أول مشاركة لي في هذا المنتدى العظيم
وحيث أنني أستفدت الكثير وتعلمت الكثير من خلال الأفاضل الموجودين هنا أردت المساعدة في شرح جزء بحثت عنه لمدة ثلاثة أيام وتوصلت له اﻵن بعد عناء والحمد لله

شكرا جزيلا اخى على وجودك معنا و نتمنى منك المزيد و اعلم ان كل شىء تقدمة من اجل تعليم الاخرين لك له اجرا عند الله .

هذا المثال قد طلبة احد الاعضاء منذ فترة ولكنى عجزت على الرد عليه ....فشكرا لك اخى

زهراء
........
........

تاريخ التسجيل : 18/02/2011
المساهمات : 262
النقاط : 372
التقيم : 24
الدولة : مصر
الجنس : انثى

الرجوع الى أعلى الصفحة اذهب الى الأسفل

رد: شرح تحديث شجرة الحسابات JTree من قاعدة البيانات

مُساهمة من طرف tampolla في الثلاثاء فبراير 16, 2016 3:57 am

NEXT كتب:جزاكم الله خيرا يا اخى

وإياكم أخي الفاضل

tampolla
..
..

تاريخ التسجيل : 12/08/2015
المساهمات : 10
النقاط : 12
التقيم : 0
الدولة : مصر
الجنس : ذكر

الرجوع الى أعلى الصفحة اذهب الى الأسفل

رد: شرح تحديث شجرة الحسابات JTree من قاعدة البيانات

مُساهمة من طرف tampolla في الثلاثاء فبراير 16, 2016 4:00 am

زهراء كتب:

شكرا جزيلا اخى على وجودك معنا و نتمنى منك المزيد و اعلم ان كل شىء تقدمة من اجل تعليم الاخرين لك له اجرا عند الله .

هذا المثال قد طلبة احد الاعضاء منذ فترة ولكنى عجزت على الرد عليه ....فشكرا لك اخى


الشكر لكم أختي الفاضلة، لقد تعلمت الكثير من هذا المنتدى الرائع وبدون مجاملة أجد هنا محتوى غني جداً بالمعلومات والشروحات.
ونتمنى من الجميع ألا يبخل بما عنده من علم
وبارك الله فيكم

tampolla
..
..

تاريخ التسجيل : 12/08/2015
المساهمات : 10
النقاط : 12
التقيم : 0
الدولة : مصر
الجنس : ذكر

الرجوع الى أعلى الصفحة اذهب الى الأسفل

رد: شرح تحديث شجرة الحسابات JTree من قاعدة البيانات

مُساهمة من طرف tampolla في الثلاثاء فبراير 16, 2016 4:30 am

إضافة أخرى قد تكون مفيدة للأخوة
بعد إنشاء شجرة الحسابات قد يود أحدنا ان يستعرض الحسابات كلها بضغطة زر بدﻻً من استعراضها حساب حساب كالتالي



وهو أمر في غاية البساطة


انشيء زر وضع بداخله الكود التالي

الرمز:
       for (int i = 0; i < jTree1.getRowCount(); i++) {
            jTree1.expandRow(i);
        }

نقوم بعمل دوران بعدد الصفوف الموجودة داخل الشجرة بإستخدام دالة getRowCount()
ثم نعطي أمر التمديد لكل صف عن طريق دالة expandRow(رقم الصف)

أتمنى أن يكون الشرح واضح وجزاكم الله كل خير

tampolla
..
..

تاريخ التسجيل : 12/08/2015
المساهمات : 10
النقاط : 12
التقيم : 0
الدولة : مصر
الجنس : ذكر

الرجوع الى أعلى الصفحة اذهب الى الأسفل

رد: شرح تحديث شجرة الحسابات JTree من قاعدة البيانات

مُساهمة من طرف tampolla في الثلاثاء فبراير 16, 2016 4:49 am

ولضم جميع العقد الفرعية ننشيء زر آخر وليكن بأسم "ضم الجميع" ونضع بداخله الكود التالي

الرمز:
        int x = jTree1.getRowCount();
        for(int i = x; i>0;i--){
        jTree1.collapseRow(i);
        }

لاحظ اننا قمنا بعمل دوران عكسي ﻷن الضم يأتي بالتدريج من أكبر رقم صف إلى اصغر رقم (والذي سيكون في مثالنا هنا شجرة الحسابات).

tampolla
..
..

تاريخ التسجيل : 12/08/2015
المساهمات : 10
النقاط : 12
التقيم : 0
الدولة : مصر
الجنس : ذكر

الرجوع الى أعلى الصفحة اذهب الى الأسفل

رد: شرح تحديث شجرة الحسابات JTree من قاعدة البيانات

مُساهمة من طرف أحمد مناع في الثلاثاء فبراير 16, 2016 4:49 pm


شكرا جزيلا اخانا الكريم على مجهودك ....أحسنت و أبدعت فى شرحك

ـــــــــــــــــــ التوقيع ــــــــــــــــــــ
سبحان الله وبحمدة .....سبحان الله العظيم

إن فقدت مكان بذورك التي بذرتها يوما ما سيخبرك المطر أين زرعتها ..لذا إبذر الخير فوق أي أرض وتحت أي سماء ومع أي أحد.. فأنت لا تعلم أين تجده ومتى تجده؟! إزرع جميلا ولو في غير موضعه .... فلا يضيع جميلا أينما زرعا .. فما أجمل العطاء... فقد تجد جزاءه في الدنيا أو يكون لك ذخرا في الآخرة

أحمد مناع
.
.

تاريخ التسجيل : 15/02/2011
المساهمات : 810
النقاط : 1479
التقيم : 69
الدولة : مصر
الجنس : ذكر

http://egy-tech.forumegypt.net

الرجوع الى أعلى الصفحة اذهب الى الأسفل

رد: شرح تحديث شجرة الحسابات JTree من قاعدة البيانات

مُساهمة من طرف tampolla في الثلاثاء فبراير 16, 2016 5:44 pm

أحمد مناع كتب:
شكرا جزيلا اخانا الكريم على مجهودك ....أحسنت و أبدعت فى شرحك

بارك الله فيك أخ أحمد نحن تلاميذك وأستفدنا منكم الكثير فجزاكم الله عنا كل خير

tampolla
..
..

تاريخ التسجيل : 12/08/2015
المساهمات : 10
النقاط : 12
التقيم : 0
الدولة : مصر
الجنس : ذكر

الرجوع الى أعلى الصفحة اذهب الى الأسفل

رد: شرح تحديث شجرة الحسابات JTree من قاعدة البيانات

مُساهمة من طرف RANA في الأربعاء فبراير 17, 2016 8:28 am


الله يعطيك العافية اخى

RANA
....
....

تاريخ التسجيل : 01/08/2013
المساهمات : 64
النقاط : 103
التقيم : 1
الدولة : فلسطين
الجنس : انثى

الرجوع الى أعلى الصفحة اذهب الى الأسفل

استعرض الموضوع السابق استعرض الموضوع التالي الرجوع الى أعلى الصفحة


 
صلاحيات هذا المنتدى:
لاتستطيع الرد على المواضيع في هذا المنتدى