"تسلسل" و Filter و Orfilter لـ Rowfilter
سؤال
لديّ jtable مع أربعة أعمدة ، أول واحد يحتوي على رقم أو نص ، النص الثلاثة الآخر فقط. أحاول تصفية هذا الجدول بمساعدة رائحة:
sorter = new TableRowSorter<TableModel>(myOwnTableModel);
مربعات الاختيار "مربعات" التي حصلت عليها بشكل جيد بما فيه الكفاية:
sorter.setRowFilter(RowFilter.regexFilter("^[0-9]$", 0));
يتم تنشيط هذا الفارز أو إلغاء تنشيطه اعتمادًا على خانة الاختيار التي يتم تعيينها أم لا.
يحدث التصفية الثانية إذا وضع المستخدم بعض النص في حقل نص. لنفسه ، هذا يعمل بشكل جيد بالفعل:
String regex = "(?i)" + Pattern.quote(s); // s = input Text of user
sorter.setRowFilter(RowFilter.regexFilter(regex, 1,2,3));
ما لا يمكنني فعله هو تفعيل كلا المرشحين في نفس الوقت. ربما أفكر في الطريق بعيدًا جدًا ، كانت فكرتي هي "تسلسل" المرشحين ، يجب أن يكون مربع الاختيار "و" الآخر "أو". جربت عدة أشياء ، بدا لي الأكثر واعدة شيء مثل:
String regex = "(?i)" + Pattern.quote(s);
bookFilter = RowFilter.regexFilter(regex, 1,2,3);
sorter.setRowFilter(bookFilter.andFilter(Arrays.asList(
RowFilter.regexFilter("^[0-9]$", 0))));
لسوء الحظ ، هذا لا يؤدي إلى أي نتيجة قابلة للاستخدام. أي أفكار موضع تقدير :)
المحلول
الحل هو إضافة ملف ActionListener
إلى JCheckBox
لتحديث حالة التصفية إذا تم تبديل خانة الاختيار وإضافة أ DocumentListener
إلى JTextField
المستند الأساسي لتحديث حالة التصفية إذا تم تحديث محتويات الحقل.
الأخطاء الأخرى في الكود الخاص بك هو أنك تتصل بالستاتيك andFilter
طريقة على الخاص بك bookFilter
على سبيل المثال ، يمر فقط في مرشح Regex الذي تم إنشاؤه حديثًا (أي أنت تمر فقط في معلمة واحدة إلى andFilter
). الاستخدام الصحيح هو:
RowFilter andFilter = RowFilter.andFilter(filter1, filter2, etc);
مثال مستمعي الحدث
JCheckBox cb = ...
cb.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
updateFilters();
}
});
JTextField tf = ...
tf.getDocument().addDocumentListener(new DocumentListener() {
public void insertUpdate(DocumentEvent e) { updateFilters(); }
public void removeUpdate(DocumentEvent e) { updateFilters(); }
publci void changedUpdate(DocumentEvent e) { updateFilters(); }
});
... ثم حدد طريقة UpdateFilters () لتثبيت مرشح جديد بناءً على وقت تحديد مربع الاختيار وما إذا كان حقل النص فارغًا أم لا.
مثال طريقة تحديث المرشح
public void updateFilters() {
if (cb.isSelected()) {
if (tf.getText().length() > 0) {
// Both filters active so construct an and filter.
sorter.setRowFilter(RowFilter.andFilter(bookFilter, checkBoxFilter));
} else {
// Checkbox selected but text field empty.
sorter.setRowFilter(checkBoxFilter);
}
} else if (tf.getText().length() > 0) {
// Checkbox deselected but text field non-empty.
sorter.setRowFilter(bookFilter);
} else {
// Neither filter "active" so remove filter from sorter.
sorter.setRowFilter(null); // Will cause table to re-filter.
}
}