الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

تعديل على صف في JTabel من خلال الضغط عليه

بدأه kiubo في 7 مايو 2012 · 5 رد · 762 مشاهدة · في JavaSE
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ورحمة الله وبركاته

::استخدم ال JTable في اضافة الحقول.. حذف والتعديل ..واضافة

عندما اضغط على سطر او صف موجود بالجدول تكون القيم تكتب تلقائي في Textfield

ال Jtext تعمل بشكل جيد

لكن في combobox لا تعطيني القيمة الموجود يالصف المختار..اي لاتوضع القيمة تلقائياً...

post-250413-022617600 1336404589_thumb.p

هنا الكود

خاص عند الضغط على السطر او الصف المراد تعديله

 private void data_jTableMouseClicked(java.awt.event.MouseEvent evt) {                                         
        int row = data_jTable.getSelectedRow();
        StudentId_field.setText(data_jTable.getModel().getValueAt(row, 0).toString());
        First_field.setText(data_jTable.getModel().getValueAt(row, 1).toString());
        Last_field.setText(data_jTable.getModel().getValueAt(row, 2).toString());
      phoneNumber_Field.setText(data_jTable.getModel().getValueAt(row, 7).toString());
        Location_Field.setText(data_jTable.getModel().getValueAt(row, 6).toString());


 //      classLevel_combobox.setSelectedIndex(data_jTable.getModel().getValueAt(row, 5));//Wrong
    //  age_ComboBox.setSelectedItem(data_jTable.getModel().getValueAt(row, 6).toString());//Wrong
    // gender_ComboBox.setSelectedItem(data_jTable.getModel().getValueAt(row, 7).toString());//Wrong




        // TODO add your handling code here:
    }

وهنا خاصه با combobox

    public void setCombobox(){

  int i=0;
        //String add = null;
        try {

            String com ="SELECT ClassLevel FROM shc.classlevel";
             preparesStat = connection_11.getConnection().prepareStatement(com);
           rssultSet=preparesStat.executeQuery();
          while(rssultSet.next()){
                  i++;
          classLevel_combobox.removeAllItems();
          rssultSet.beforeFirst();
          classLevel_combobox.addItem("");
       while(rssultSet.next()){

              classLevel_combobox.addItem(rssultSet.getString("ClassLevel"));



           //Text.setText(add);

          }}
    }catch (SQLException e1) {
        JOptionPane.showMessageDialog(null, e1+"Cobobox...");
          }

}



    public int getClasslevel(){

 int classlevel =  classLevel_combobox.getSelectedIndex();


 return classlevel;
}

     public int getAge(){

 int Age =  age_ComboBox.getSelectedIndex()+6;


 return Age;
}

          public String getGender(){


String gemderName = null ;
 if(gender==1){
 gemderName ="Female";
 }
 else if(gender==2){

         gemderName ="Male";  
          }
 return gemderName;
} 

}

وهنا الجداول وشكلها

delimiter $$

CREATE TABLE `classlevel` (
  `index` int(11) NOT NULL,
  `ClassLevel` varchar(45) DEFAULT NULL,
  PRIMARY KEY (`index`),
  UNIQUE KEY `index_UNIQUE` (`index`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8$$





delimiter $$

CREATE TABLE `student` (
  `StudentId` varchar(9) NOT NULL,
  `ClassLevel_index` int(11) NOT NULL,
  `Age` int(11) DEFAULT NULL,
  `FirstName` varchar(30) DEFAULT NULL,
  `LastName` varchar(30) DEFAULT NULL,
  `FirstName_AR` varchar(30) DEFAULT NULL,
  `LastName_AR` varchar(30) DEFAULT NULL,
  `Location` varchar(45) DEFAULT NULL,
  `Gender` varchar(6) DEFAULT NULL,
  `HomePhoneNumber` varchar(9) DEFAULT NULL,
  PRIMARY KEY (`StudentId`,`ClassLevel_index`),
  KEY `fk_Student_ClassLevel1` (`ClassLevel_index`),
  CONSTRAINT `fk_Student_ClassLevel1` FOREIGN KEY (`ClassLevel_index`) REFERENCES `classlevel` (`index`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=utf8$$

delimiter $$

سؤال اخر في حال اردت تغير اسماء الاعمد هل استطعين ذلك مع العلم اني استخدم مكتبة

import net.proteanit.sql.DbUtils;

هنا

تكلمه للكود

    private void formWindowOpened(java.awt.event.WindowEvent evt) {                                  
this.setCombobox();
//datacon.connected();

        // TODO add your handling code here:
    }

بحيث اقوم بتجهيوها عند فتح ال JFrame

المرفقات
problemkk.png

تم تعديل هذه المشاركة بواسطة kiubo في 7 مايو 2012 في 18:29

كن مثل طابع البريد ، التصق بهدفك...حتى تصل الى هناك!

#2

تأكد من ملأ القائمة combobox اولا

على كل هذا هو كود التعبئة بعد التعديل

try {

    String com ="SELECT ClassLevel FROM shc.classlevel";
    preparesStat = connection_11.getConnection().prepareStatement(com);
    rssultSet=preparesStat.executeQuery();
    classLevel_combobox.removeAllItems();
    while(rssultSet.next()){
        classLevel_combobox.addItem(rssultSet.getString("ClassLevel"));
    }

}catch (SQLException e1) {
    JOptionPane.showMessageDialog(null, e1 + " Combobox...");
}


﴿وَمَا كَانَ اللَّهُ لِيُعَذِّبَهُمْ وَأَنْتَ فِيهِمْ ۚ وَمَا كَانَ اللَّهُ مُعَذِّبَهُمْ وَهُمْ يَسْتَغْفِرُونَ﴾

الأنفال ۳۳                                  
 

#3
First_field.setText(data_jTable.getModel().getValueAt(row, 1).toString());

بالنسبة لهذا السطر اعتقد انه الاصح انك تعملي casting الى النوع المحدد

الامر يعتمد على كيف قمتي باضافته الى الجدول كString ام كـObject اذا كان Object فربما toString() تعطيكي قيمة الreference

StudentId_field.setText((String)data_jTable.getModel().getValueAt(row, 0);

فيم يخص الComboBox فالافضل بدلا من مسح جميع العناصر ثم ادخالها ان تصنعي ComboBoxModel جديد تضعي في العناصر المقرؤه من قاعدة البيانات ثم تقومين بعمل

combo.setModel();

اليس من المفترض ان تستدعى setComboBox() في دالة معالجة الحدث الخاصه بالماوس?

ايضا للتاكيد لا تنسي وضع ";" في نهاية الاستعلام لقاعدة البيانات

السطر

int classlevel =  classLevel_combobox.getSelectedIndex();

اليس من المفترض ان يكون

int classlevel =  classLevel_combobox.getSelectedIndex()+1;

ام انكي تبداين العد من الصفر؟

تاكدي من دوال التعديل على الكومبو بوكس تستدعى عندما تقومين باحداث الماوس ايفينت ، ايضا تاكدي من انه ليس هناك اي اكسبشين

قومي بعمل JOptionPane في كل خطوه من خطوات تحديث الكومبو بوكس بحيث تستطعين عمل Tracing لمكان الخطأ

بالتوفيق

1

No intellectual battle was ever won through retreat
You do not watch Gintama? Dude, you are missing a lot!


صورةmsrgb1485.gif ocajavase7programmerclr.gif

#4
mental-driller كتب:

First_field.setText(data_jTable.getModel().getValueAt(row, 1).toString());

بالنسبة لهذا السطر اعتقد انه الاصح انك تعملي casting الى النوع المحدد

الامر يعتمد على كيف قمتي باضافته الى الجدول كString ام كـObject اذا كان Object فربما toString() تعطيكي قيمة الreference

StudentId_field.setText((String)data_jTable.getModel().getValueAt(row, 0);

فيم يخص الComboBox فالافضل بدلا من مسح جميع العناصر ثم ادخالها ان تصنعي ComboBoxModel جديد تضعي في العناصر المقرؤه من قاعدة البيانات ثم تقومين بعمل

combo.setModel();

اليس من المفترض ان تستدعى setComboBox() في دالة معالجة الحدث الخاصه بالماوس?

ايضا للتاكيد لا تنسي وضع ";" في نهاية الاستعلام لقاعدة البيانات

السطر

int classlevel =  classLevel_combobox.getSelectedIndex();

اليس من المفترض ان يكون

int classlevel =  classLevel_combobox.getSelectedIndex()+1;

ام انكي تبداين العد من الصفر؟

تاكدي من دوال التعديل على الكومبو بوكس تستدعى عندما تقومين باحداث الماوس ايفينت ، ايضا تاكدي من انه ليس هناك اي اكسبشين

قومي بعمل JOptionPane في كل خطوه من خطوات تحديث الكومبو بوكس بحيث تستطعين عمل Tracing لمكان الخطأ

بالتوفيق

دعني اشرح الطريقة

كل مااردته من قبل هو ادخال القيم من القاعدة الي combobox وبعد تم ذلك يلتزم على التعامل مع العناصر بمواقعها index,, وانا اريد التعامل معها كاقيمة ,, ولذا تراى اني وضعت

getSelectedIndex()+6

اقصد فيها ابدء من العدمن الرقم 6

6 يتعاد الصف السادس كاقيمة "classLevel" وتخزن بالقاعده ب رقم 6 اي المفتاح الاجنبي

ربما الفكره تكون بسيطه لكن سبب كتابتي هذا الكود بهذة الطريقة هي عدم معرفتي الجيد لكن هذا ليس عذر ايضاً

على ايه حال هنا لدي بعض التعليقات كي استطيع التعديل بطريقه صحيحه ..

تعليقي

اقتباس

تاكدي من دوال التعديل على الكومبو بوكس تستدعى عندما تقومين باحداث الماوس ايفينت ، ايضا تاكدي من انه ليس هناك اي اكسبشين

قومي بعمل JOptionPane في كل خطوه من خطوات تحديث الكومبو بوكس بحيث تستطعين عمل Tracing لمكان الخطأ

عفواً...لم افهم ماتقصد.. اتقصد الموجوده في كلاس ال AbstractListModel

اقتباس
فيم يخص الComboBox فالافضل بدلا من مسح جميع العناصر ثم ادخالها ان تصنعي ComboBoxModel جديد تضعي في العناصر المقرؤه من قاعدة البيانات

لنفرض ان كل combobox لدية model الخاص به قل اقوم به بناء على ماقرئته وفهمته بهذا الرابط

واربطه كل واحد بالقاعده

طيب اذا ارت التعامل مع ال combobox كا

praimery key

بمعني في حال المستخدم اختار ال FirstClass ذات index رقم 1 وهكذا

قمت بكتابة هذا الكود يمثل الفكره اعلاه ..

    @Override
    public Object getElementAt(int index) {



  ;String sql = "SELECT ClassLevel FROM shc.classlevel";


    try{
        preparesStat = connection_11.getConnection().prepareStatement(sql);

        preparesStat.setInt(1,index);
        String classlevel  = rssultSet.getString("ClassLevel");
    }
        catch (SQLException ex) {
            Logger.getLogger(combobox.class.getName()).log(Level.SEVERE, null, ex);
        }


    return classlevel;
    }

كن مثل طابع البريد ، التصق بهدفك...حتى تصل الى هناك!

#5
اقتباس

عفواً...لم افهم ماتقصد.. اتقصد الموجوده في كلاس ال AbstractListModel

قصدي انه عندما يتم الضغط على سطر في الجدول فان دالة التعامل مع هذا الحدث تستدعى بحيث تقوم بملئ الحقول التي في الاعلى بهذه القيم

حسب ما ارى انه الدالة تعمل بكشل جيد بتعبئة الــtext fields ولكنها تفشل عند الكومبو بوكس ، صحيح؟

اذا تاكدي اولا من ان الاستعلام الخاص بالكومبو بوكس The query that is concerned with the combobox يعمل بشكل صحيح اي انه يرجع قيم من قاعدة البيانات

ثم تاكدي من ان الكود الذي يقوم بالعمل (اي تعبئة الكومبو بوكس ) يتم استدعائة

لماذا قلت JOptionPane وسيلة عرض معلومات لا اكثر يمكنك استخدام System.out.println لكي تتاكدي من الكود يعمل بشكل صحيح مثلا تقومين بطباعة القيم بعد السطر n اذا عمل بشكل جيد تقومين بطباعة القيم عند السطر n+1 وهكذا حتى تصلي الى السطر الذي تحدث عنده المشكله

اقتباس

لنفرض ان كل combobox لدية model الخاص به قل اقوم به بناء على ماقرئته وفهمته بهذا الرابط

واربطه كل واحد بالقاعده

طيب اذا ارت التعامل مع ال combobox كا

praimery key

بمعني في حال المستخدم اختار ال FirstClass ذات index رقم 1 وهكذا

قمت بكتابة هذا الكود يمثل الفكره اعلاه ..

بالنسبة لفكرة الComboBoxModel انا اقترحتها عليكي بدلا من عمل Remove All ثم التعبئة بشكل يدوي ، فالاسهل ان تقومي بعمل اوبجكت من نوع DefaultComboBoxModel ثم داخل لوب تقومين بعمل add لهذا الموديل وفي الاخير

تقومين بعمل setModel وهكذا وفرتي على نفسكي عمل RemoveAll

بما ان الحقل primary Key اقترح ان تجعليه uneditable بحيث يمكن للمستخدم فقط قراته ولكن لايستطيع التعديل عليه وتجعلين عملية توليد الرقم Auto Generated من قاعدة البيانات وهكذا ليس عليكي ان تقومي بادخال هذا الرقم في الــ Insert Statement

بالنسبة لمسألة انه اذا تم حذف بعض عناصر الprimary key كحذف مثلا الرقم 6 ثم يصبح لدينا 5 ثم 7 يمكنك عمل trigger يقوم بتعديل الجدول ولكن اجعلي هذا العمل على قاعدة البيانات

بالتوفيق وبانتظار ماذا سوف يطرأ على المشروع

تم تعديل هذه المشاركة بواسطة mental-driller في 8 مايو 2012 في 22:32

1

No intellectual battle was ever won through retreat
You do not watch Gintama? Dude, you are missing a lot!


صورةmsrgb1485.gif ocajavase7programmerclr.gif

#6
اقتباس
قصدي انه عندما يتم الضغط على سطر في الجدول فان دالة التعامل مع هذا الحدث تستدعى بحيث تقوم بملئ الحقول التي في الاعلى بهذه القيم

قمت بوضعها في

private void formWindowOpened(java.awt.event.WindowEvent evt) {

لايوجد سبب لذالك اردت عند فتح الصفحه القيم يتم تلقائياً تجهيزها ..

اقتباس

حسب ما ارى انه الدالة تعمل بكشل جيد بتعبئة الــtext fields ولكنها تفشل عند الكومبو بوكس ، صحيح؟

اذا تاكدي اولا من ان الاستعلام الخاص بالكومبو بوكس The query that is concerned with the combobox يعمل بشكل صحيح اي انه يرجع قيم من قاعدة البيانات

ثم تاكدي من ان الكود الذي يقوم بالعمل (اي تعبئة الكومبو بوكس ) يتم استدعائة

لماذا قلت JOptionPane وسيلة عرض معلومات لا اكثر يمكنك استخدام System.out.println لكي تتاكدي من الكود يعمل بشكل صحيح مثلا تقومين بطباعة القيم بعد السطر n اذا عمل بشكل جيد تقومين بطباعة القيم عند السطر n+1 وهكذا حتى تصلي الى السطر الذي تحدث عنده المشكله

صحيح في ماقلته واستراتيجه افضل استخدامها ,, للتأكد من صحة ال methods or variables

اقتباس

بالنسبة لفكرة الComboBoxModel انا اقترحتها عليكي بدلا من عمل Remove All ثم التعبئة بشكل يدوي ، فالاسهل ان تقومي بعمل اوبجكت من نوع DefaultComboBoxModel ثم داخل لوب تقومين بعمل add لهذا الموديل وفي الاخير

تقومين بعمل setModel وهكذا وفرتي على نفسكي عمل RemoveAll

خلاصة كلامك اقوم بااعداد ال model الخاص فيها واقوم ببناء ال methods على حسب مااريد بعد التأكد منها(التأكد من عملها)..

اقتباس

بما ان الحقل primary Key اقترح ان تجعليه uneditable بحيث يمكن للمستخدم فقط قراته ولكن لايستطيع التعديل عليه وتجعلين عملية توليد الرقم Auto Generated من قاعدة البيانات وهكذا ليس عليكي ان تقومي بادخال هذا الرقم في الــ Insert Statement

بالنسبة لمسألة انه اذا تم حذف بعض عناصر الprimary key كحذف مثلا الرقم 6 ثم يصبح لدينا 5 ثم 7 يمكنك عمل trigger يقوم بتعديل الجدول ولكن اجعلي هذا العمل على قاعدة البيانات

اذن المقصود هوا انشاء كلاس classlevel بقيم ال PKيتم توليدها تلقائياً حيث we don't care about the primary key

ويتم ادخال القيمه النصيه مباشره

اخر تطورات المشروع

هذة ااضافه(ادخال اسماء الطلاب) تم ازالتها من المشروع بطلب مني

شكرا جزيلا mental-driller

تم تعديل هذه المشاركة بواسطة kiubo في 9 مايو 2012 في 15:53

كن مثل طابع البريد ، التصق بهدفك...حتى تصل الى هناك!

مواضيع مشابهة