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.

Я надеюсь, что объяснил свою проблему хорошо. Сообщите мне, не понимаете ли Вы.

7
задан twodayslate 22 March 2010 в 22:32
поделиться

1 ответ

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

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

EDIT: В документе, на который я ссылался, есть пример создания AndFilter из двух RegexFilter, но пример довольно глупый. Он создает фильтр, который ищет foo в любом столбце или bar в любом столбце - что в точности соответствует одному RegexFilter с foo|bar в качестве regex и без указанных столбцов. Хороший пример 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) + "$";
12
ответ дан 6 December 2019 в 09:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: