سؤال

هل هناك أي كتب أو مواقع ويب جيدة تتناول إنشاء ملف JTable؟أريد أن أجعل عمودًا واحدًا قابلاً للتحرير.وأود أن أضع فعلا الموروثة JCheckBox المكون (الذي أنشأناه هنا) في أحد أعمدة الجدول بدلاً من وضع الجدول فقط JCheckBox على أساس أنه قابل للتحرير boolean مجال.

لدي JFC سوينغ البرنامج التعليمي الطبعة الثانية كتاب ولكني أود فقط معرفة ما إذا كانت هناك أمثلة أخرى يمكنني الاطلاع عليها ومعرفة كيفية التعامل مع الجداول بشكل أفضل.يبدو أن الكتاب يأخذ "مسار" جافا عبر الإنترنت ويضعه في الكتاب.

أنا أعيد قراءة الأشياء على الرغم من ذلك، فقط أشعر بالفضول إذا وجد أي شخص شيئًا قد يساعد أكثر.

هل كانت مفيدة؟

المحلول

لجعل العمود قابلاً للتحرير، يجب عليك تجاوز isCellEditable الطريقة في TableModel.خلق شيء TableModel من السهل إلى حد ما إذا كنت ورثت AbstractTableModel وأنا أوصي به للجميع باستثناء الأكثر بساطة JTableس.

ومع ذلك، التكيف TableModel ليس سوى جزء مما عليك القيام به.للحصول فعليًا على مكون مخصص في ملف JTable, ، فأنت بحاجة إلى تعيين عارض خلايا مخصص.لاستخدام مكون مخصص تفاعلي، تحتاج إلى تعيين محرر خلايا مخصص.في بعض الحالات، يكفي استخدام إصدارات معدلة قليلاً من الفئات الافتراضية لهذا الغرض.

المحررين

إذا كان لديك بالفعل مكون مخصص، فيمكن القيام بذلك بسهولة باستخدام التفويض:إنشاء فئة جديدة التنفيذ TableCellEditor, ، وعودة أ جديد مثال المكون في getCellEditorComponent طريقة.تشتمل معلمات هذه الطريقة على القيمة الحالية بالإضافة إلى إحداثيات الخلية ورابط العودة إلى الجدول وما إذا تم تحديد الخلية أم لا.

ال TableCellEditor يحتوي أيضًا على طريقة يتم استدعاؤها عندما يقوم المستخدم بإجراء تغيير على محتويات الخلية (حيث يمكنك التحقق من صحة إدخال المستخدم وضبط النموذج) أو إلغاء التحرير.تأكد من الاتصال ب stopEditing() الطريقة على المحرر الخاص بك إذا قمت بإلغاء التحرير برمجيًا، وإلا فسيظل مكون المحرر على الشاشة - استغرق هذا مني ساعتين تقريبًا لتصحيح الأخطاء.

لاحظ أنه ضمن أ JTable المحررين و فقط المحررين تلقي الأحداث!يمكن عرض الزر باستخدام العارض.ولكن للحصول على زر فعال، تحتاج إلى تنفيذ محرر بالزر الصحيح EventListeners مسجل.تسجيل المستمع على العارض لا يفعل شيئًا.

العارضين

إن تنفيذ العارض ليس ضروريًا تمامًا لما تصفه في سؤالك، ولكن عادةً ما ينتهي بك الأمر إلى القيام بذلك على أي حال، ولو لإجراء تعديلات طفيفة فقط.إن العارضين، على عكس المحررين، يعتبرون السرعة أمرًا بالغ الأهمية. ال getTableCellRendererComponent يتم استدعاء العارض مرة واحدة لكل خلية في الجدول! يتم استخدام المكون الذي يتم إرجاعه بواسطة العارض فقط لطلاء الخلية، وليس للتفاعل، وبالتالي يمكن "إعادة استخدامه" للخلية التالية.وبعبارة أخرى، يجب عليك ضبط المكون (على سبيل المثال.استخدام setText(...) أو setFont(...) إذا كان أ TextComponent) في العارض، يجب عليك ذلك لا إنشاء مثيل جديد - هذه طريقة سهلة لإعاقة الأداء.

تحفظات

لاحظ أنه لكي يعمل العارضون والمحررون، يجب عليك إخبار JTable متى يتم استخدام عارض/محرر معين.هناك أساسا طريقتان للقيام بذلك.يمكنك تعيين عارض/محرر الخلية الافتراضي لنوع معين باستخدام المعنية JTable طُرق.لهذه الطريقة للعمل، الخاص بك TableModel يحتاج إلى العودة بالضبط هذا النوع في getColumnClass(...) طريقة!نموذج الجدول الافتراضي سوف لا افعل هذا من أجلك، فهو يعود دائمًا Object.class.أنا متأكد من أن واحدة قد حيرة الكثير من الناس.

الطريقة الأخرى لتعيين المحرر/العارض هي عن طريق تعيينه بشكل صريح على العمود نفسه، أي عن طريق الحصول على TableColumn عبر getTableColumn(...) طريقة JTable.يعد هذا أكثر تفصيلاً، ولكنه أيضًا الطريقة الوحيدة للحصول على عارضين/محررين مختلفين لفئة واحدة.على سبيل المثالقد يحتوي النموذج الخاص بك على عمودين من فئة السلسلة والتي يتم عرضها بطرق مختلفة تمامًا، ربما مرة واحدة باستخدام ملف JLabel/DefaultRenderer والآخر باستخدام أ JButton للوصول إلى محرر أكثر تفصيلا.

JTable مع العارضين والمحررين المخصصين لها لأقصى حد متعددة الاستخدامات، ولكن هناك أيضًا الكثير مما يجب استيعابه، وهناك الكثير من الأشياء التي يجب القيام بها بشكل خاطئ.حظ سعيد!

كيفية استخدام الجداول في البرنامج التعليمي سوينغ قراءة إلزامية لأي شخص يقوم بتخصيص JTables.على وجه الخصوص، اقرأ وأعد القراءة المفاهيم:المحررين والعارضين لأنه عادة ما يستغرق بعض الوقت حتى يتم "النقر".تعتبر الأمثلة على العارضين والمحررين المخصصين جديرة بالاهتمام أيضًا.

نصائح أخرى

الفئة التي تريد النظر في توسيعها لإنشاء سلوكك الخاص هي DefaultTableModel.سيسمح لك ذلك بتحديد سلوكك الخاص.يمكن العثور على برنامج تعليمي لائق في موقع الشمس.

هذا البرنامج التعليمي من ردهة جافا من السهل المتابعة.على الانترنت مسار التأرجح لـ JTable الذي تشير إليه يشير إلى أنه تم تحديثه.هل قمت بمسح كل شيء بحثًا عن معلومات أفضل (ليست الأحدث دائمًا هي الأفضل)؟

إذا كنت تحاول استخدام بسيطة JTable مع وجود عمود واحد قابل للتحرير وأنت تعرف موقع العمود، يمكنك دائمًا استخدام نموذج الجدول الافتراضي وزيادة تحميله isCellEditable يتصل.

شيء من هذا القبيل :

myTable.setModel(new DefaultTableModel(){
@Override
public boolean isCellEditable(int row, int column) {
    if (column == x) {
        return true;
    } else
        return false;
}
});

وبالنسبة لمربع الاختيار، قم بإنشاء فئة العارض

MyCheckBoxRenderer extends JCheckBox implements TableCellRenderer

بعض الفئات المفيدة هي:

Package javax.swing.table :

TableModel - واجهة ل tablemodel AbstractTableModel - فئة رائعة يمكن توسيعها لإنشاء الجدول الخاص بك باستخدام هياكل بيانات مخصصةDefaultTableModel - نموذج الجدول الافتراضي الذي يمكن التعامل معه arrays[] و Vectors

لتعطيل التحرير على أي خلية تحتاج إلى تجاوز isCellEditable(int row, int col) طريقة

في نموذج الجدول الخاص بك، يجب عليك تجاوز وظائف "isCellEditable" و"setValueAt"، كما هو موضح أدناه.
العمود 4 هو عمود الخلايا القابلة للتحرير.
وبعد ذلك، عندما تنقر نقرًا مزدوجًا فوق الخلية وتكتب شيئًا ما،
سيتم استدعاء setValueAt() وحفظ القيمة في الحقل col4 الخاص بالجدول.

public ArrayList<XXXDO> tbmData = new ArrayList<XXXDO>(); //arraylist for data in table

@Override
public boolean isCellEditable(int row, int col) {
    if (col == 4) {
        return true;
    } else {
        return false;
    }
}

@Override
public void setValueAt(Object value, int row, int col) {
    if ((row >= 0) && (row < this.tbmData.size()) && (col >= 0) && (col < this.colNm.length)) {
        if (col == 4) {
            tbmData.get(row).col4= (String) value;
        }
        fireTableCellUpdated(row, col);
    } else {
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top