Фильтр JTable на основе jtextfield НЕ ЧУВСТВИТЕЛЬНО к регистру (Java) - PullRequest
2 голосов
/ 27 ноября 2011

Я уже могу фильтровать JTable, используя JTextField, проблема в том, что он чувствителен к регистру. Например, я получил это имя в Jtable: «Guillian Fox», если я напишу «guillian fox» или «GUILLIAN FOX» в текстовом поле, имя которого не отображается.

Я знаю, что у java есть методы .toLowerCase или .toUpperCase, но проблема с использованием этих методов в том, что результат будет неприглядным, потому что оба должны быть в верхнем или нижнем регистре, когда подходящей будет первая буква в верхнем регистре, потому что имена.

Строки JTable взяты из запроса в базе данных. Итак, решение, о котором я думал, это не делать фильтр непосредственно в jtable, вместо этого делать запрос, который фильтрует результаты, но я думаю, что это очень неэффективно, учитывая, что я сделаю запрос для каждого символа, вставленного или удаленного из textField.

@Override
    public void changedUpdate(DocumentEvent arg0) {
        ordenador.setRowFilter(RowFilter.regexFilter(jtxtfBuscarInv.getText(), 0));

    }

    @Override
    public void insertUpdate(DocumentEvent arg0) {
        ordenador.setRowFilter(RowFilter.regexFilter(jtxtfBuscarInv.getText(), 0));

    }

    @Override
    public void removeUpdate(DocumentEvent arg0) {
        ordenador.setRowFilter(RowFilter.regexFilter(jtxtfBuscarInv.getText(), 0));

    }

Ответы [ 3 ]

8 голосов
/ 27 ноября 2011

для игнорирования CaseWh независимо от

ordenador.setRowFilter(RowFilter.regexFilter("(?i)" + text));

, но для не-ASCII-сообщений, вы должны проверить четыре клавиши (2x2) в соответствии с / рядом с Big ENTER на клавиатуре,

, если высвязан с этой проблемой, то вы должны исключить эти четыре клавиши из клавиатуры и написать собственную матрицу для UpperCase и LoverCase тоже

1 голос
/ 27 ноября 2011

Вы можете сделать что-то вроде этого (скопировано почти так же, как и из документа Java)с.Возможно, тип должен быть адаптирован к вашей модели.

0 голосов
/ 19 марта 2013

Может быть, кому-то поможет мое решение.Моя проблема: у меня есть JTable, данные в JTable содержат национальные символы (с акутами и клиньями).У меня есть JTextField в качестве ввода в RowFilter.

В JTextField у меня есть DocumentListener:

textFielInput.getDocument().addDocumentListener(new DocumentListener(){
@Override
public void changedUpdate(DocumentEvent e){
    applyFilter();
}

@Override
public void insertUpdate(DocumentEvent e){
    applyFilter();
}

@Override
public void removeUpdate(DocumentEvent e){
    applyFilter();
}

});

Затем реализация RowFilter:

    private void applyFilter()
{
    RowFilter<MyTableModel, Integer> filter = null;
    final String filteringText = this.textFielInput.getText().toLowerCase(new Locale("cs_CZ"));
    filter = new RowFilter<MyTableModel, Integer>()
    {
        @Override
        public boolean include(Entry<? extends MyTableModel, ? extends Integer> entry)
        {
            for(int i = entry.getValueCount() - 1; i >= 0; i--)
            {
                String filteredField = entry.getStringValue(i).toLowerCase(new Locale("cs_CZ"));
                if(filteredField.contains(filteringText))
                {
                    return true;
                }
            }
            return false;
        }
    };
}
this.sorter.setRowFilter(filter);

и, конечно, потребуется сортировщик:

sorter = new TableRowSorter<MyTableModel>(new MyTableModel());

Таким образом, не имеет значения, является ли текст, вставленный в поле поиска, верхним или нижним, и не имеет значения, ниже ли данные в JTable.или верхний + переводит верхний нижний в зависимости от заданной локали.

Надежда поможет.

...