سؤال

لديّ 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.
  }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top