rowfilter.regexfilter أعمدة متعددة
سؤال
أنا حاليا أستخدم ما يلي لتصفية بلدي JTable
RowFilter.regexFilter(
Pattern.compile(textField.getText(),
Pattern.CASE_INSENSITIVE).toString(), columns );
كيف يمكنني تنسيق بلدي textField
أو تصفية لذلك إذا أردت تصفية أعمدة متعددة يمكنني القيام بذلك. في الوقت الحالي ، يمكنني تصفية أعمدة متعددة ولكن يمكن أن يكون المرشح الخاص بي من أحد الأعمدة فقط
مثال قد يساعد شرطي بشكل أفضل:
Name Grade GPA
Zac A 4.0
Zac F 1.0
Mike A 4.0
Dan C 2.0
سيحتوي حقل النص Zac A
أو شيء مشابه وسيظهر أول صف ZAC إذا columns
كان int[]{0, 1}
. الآن إذا فعلت ما سبق ، فلن أحصل على شيء. مرشح Zac
يعمل لكلي كلاهما Zac
'س. A
يعمل أيضًا ولكن سأحصل بعد ذلك Zac A 4.0
و Mike A 3.0
.
آمل أن أكون قد شرحت مشكلتي جيدًا. واسمحوا لي أن أعرف إذا كنت لا تفهم.
المحلول
يبدو أنك إما بحاجة إلى إنشاء مرشح منفصل لكل عمود ودمجه مع andfilter, أو اكتب المرشح الخاص بك عن طريق تجاوز تضمن() طريقة. لا يتطلب regexfilter سوى أحد الأعمدة المحددة لمطابقة ، ولا يبدو أن هناك طريقة لتغيير ذلك.
بالمناسبة ، إذا كنت ترغب في إجبار Regex على تجاهل الحالة ، فيجب عليك إضافة (?i)
إلى بداية ذلك. السلسلة التي تنشئها هي نفسها التي بدأت بها ، على الرغم من استخدامك لعلم Case_insitive.
تحرير: يحتوي المستند الذي ربطته على مثال على إنشاء وفيلتر من اثنين من المرشحين ، لكن المثال سخيف للغاية. يخلق مرشحًا يبحث عنه foo
في أي عمود أو bar
في أي عمود-وهو بالضبط نفس regexfilter مع foo|bar
كما regex وليس أعمدة محددة. يجب أن يفعل مثال جيد وتصفية شيء لا يمكن إلا للتصفية القيام به: فرض الظروف على عمودين أو أكثر في وقت واحد ، كما تحاول القيام به. إليكم كيف يمكنني تصفية الحالة Zac
في العمود الأول و A
في الثانية:
List<RowFilter<Object,Object>> rfs =
new ArrayList<RowFilter<Object,Object>>(2);
filters.add(RowFilter.regexFilter("(?i)^Zac$", 0));
filters.add(RowFilter.regexFilter("(?i)^A$", 1));
RowFilter<Object,Object> af = RowFilter.andFilter(rfs);
أيضًا ، إذا كنت أقبل نص المرشح كمدخل للمستخدم (الذي يبدو أنك تفعله) ، فربما أقتبس منه أولاً:
String regex = "(?i)^" + Pattern.quote(input) + "$";
نصائح أخرى
من خلال الجمع بين البرنامج التعليمي Oracle الجداول والجواب من آلان, ، انا فعلت هذا:
RowFilter<PublicationTableModel, Object> rf = null;
List<RowFilter<Object,Object>> rfs =
new ArrayList<RowFilter<Object,Object>>();
try {
String text = txtFilter.getText();
String[] textArray = text.split(" ");
for (int i = 0; i < textArray.length; i++) {
rfs.add(RowFilter.regexFilter("(?i)" + textArray[i], 0, 1, 2, 4));
}
rf = RowFilter.andFilter(rfs);
} catch (java.util.regex.PatternSyntaxException e) {
return;
}
sorter.setRowFilter(rf);
إنه مرشح بسيط جدًا يأخذ كل النص من مربع النص ، ويقسم الكلمات ويقوم بإنشاء العديد من المرشحات ديناميكيًا. بعد ذلك ، دمجهم مع وفيلتر ووضعه في الخلف لنموذج الجدول.
RowFilter<TableModel, Object> filter =
RowFilter.orFilter(Arrays.asList(RowFilter.regexFilter(lookup,0),
RowFilter.regexFilter(lookup, 1)));
أو
RowFilter<TableModel, Object> filter =
RowFilter.regexFilter(Pattern.compile(lookup,Pattern.CASE_INSENSITIVE).toString(),0,1);
0 و 1 هما أرقام الأعمدة