سؤال

أنا حاليا أستخدم ما يلي لتصفية بلدي 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 هما أرقام الأعمدة

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top