RowFilter.regexFilter несколько столбцов - PullRequest
6 голосов
/ 22 марта 2010

В настоящее время я использую следующее, чтобы отфильтровать мои 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.

Надеюсь, я хорошо объяснил свою проблему. Пожалуйста, дайте мне знать, если вы не понимаете.

Ответы [ 3 ]

11 голосов
/ 23 марта 2010

Похоже, вам нужно либо создать отдельный фильтр для каждого столбца и объединить их с AndFilter , либо написать свой собственный фильтр, переопределив метод include () .Для RegexFilter требуется соответствие только одного из указанных столбцов, и, похоже, нет способа изменить это.

Кстати, если вы хотите заставить регулярное выражение игнорировать регистр, вы должны добавить(?i) к началу.Генерируемая вами строка совпадает с той, с которой вы начали, несмотря на то, что вы используете флаг CASE_INSENSITIVE.

РЕДАКТИРОВАТЬ: документ, с которым я связан, содержит пример создания AndFilter из двух RegexFilters, нопример довольно глупый.Он создает фильтр, который ищет foo в любом столбце или bar в любом столбце - что в точности совпадает с одним RegexFilter с foo|bar в качестве регулярного выражения и без указания столбцов.Хороший пример AndFilter должен делать то, что может сделать только AndFilter: применять условия для двух или более столбцов одновременно, как вы пытаетесь это сделать.Вот как я бы фильтровал без учета регистра для 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) + "$";
5 голосов
/ 13 апреля 2012

Объединив урок оракула по таблицам и ответ от Алан , я сделал это:

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);

Это довольно простой фильтр, который берет весь текст из текстового поля, разбивает слова и динамически создает множество фильтров. Затем, объединяя их с фильтром andFilter и вставляя обратно в сортировщик для модели стола.

1 голос
/ 06 сентября 2010
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 - номера столбцов

...