使用JTextField的JTable过滤不起作用

时间:2011-08-15 15:56:07

标签: java swing jtable filtering

我有一个JTable(DefaultTableModel)和一个JTextField。我想用我放入文本字​​段的正则表达式过滤JTable。当我启动程序时,会显示所有条目,但是当我在文本字段中输入文本时,即使它应该在一行中找到文本,也不会显示任何行。

private void createFilter() {
    _sorter = new TableRowSorter<DefaultTableModel>(new DefaultTableModel());

    JPanel filterPanel = new JPanel();
    filterPanel.setLayout(new BorderLayout());

    JLabel filterLabel = new JLabel("Filter:");
    filterPanel.add(filterLabel, BorderLayout.WEST);

    _inputField = new JTextField();
    _inputField.setColumns(40);
    filterPanel.add(_inputField, BorderLayout.CENTER);
    _inputField.getDocument().addDocumentListener(new DocumentListener() {
        public void insertUpdate(DocumentEvent de) {
            newFilter();
        }

        public void removeUpdate(DocumentEvent de) {
            newFilter();
        }

        public void changedUpdate(DocumentEvent de) {
            newFilter();
        }
    });

    JButton clearButton = new JButton("X");
    clearButton.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            _inputField.setText("");
        }
    });
    filterPanel.add(clearButton, BorderLayout.EAST);

    _mainFrame.add(filterPanel, BorderLayout.SOUTH);
}

private void newFilter() {
    RowFilter<DefaultTableModel, Object> rowFilter = null;
    try {
        rowFilter = RowFilter.regexFilter(_inputField.getText());
    }
    catch(java.util.regex.PatternSyntaxException ex) {
        return;
    }
    _sorter.setRowFilter(rowFilter);
    _table.setRowSorter(_sorter);
}

我的调试器告诉我,rowFilter已初始化,因此不能因为RegEx错误。每次按键时都会调用newFilter()。

提前致谢。如果需要,我很乐意提供更多信息。

此致 迈克尔

3 个答案:

答案 0 :(得分:5)

似乎JTable和TableRowSorter都有不同的表模型。应使用JTable的表模型构造TableRowSorter。

答案 1 :(得分:1)

JTable教程包含JTable Filtering and Sorting的示例,另一个示例here

对于Case Insensitive,你必须设置 TableRowSorter<TableModel>#setRowFilter( RowFilter.regexFilter("(?i)" + myTextField.getText()));

编辑:

基本解决方法:

final TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>(tableFxModel);
myTable.setRowSorter(sorter);
filterFxText.getDocument().addDocumentListener(new DocumentListener() {

    private void searchFieldChangedUpdate(DocumentEvent evt) {
         String text = filterFxText.getText();
         if (text.length() == 0) {
            sorter.setRowFilter(null);
         } else {
             try {
                 sorter.setRowFilter(RowFilter.regexFilter("(?i)" + text));
             } catch (PatternSyntaxException pse) {
                 JOptionPane.showMessageDialog(null, "Bad regex pattern", 
                     "Bad regex pattern", JOptionPane.ERROR_MESSAGE);
             }
         }
     }

     @Override
     public void insertUpdate(DocumentEvent evt) {
          searchFieldChangedUpdate(evt);
     }

     @Override
     public void removeUpdate(DocumentEvent evt) {
           searchFieldChangedUpdate(evt);
     }

     @Override
     public void changedUpdate(DocumentEvent evt) {
          searchFieldChangedUpdate(evt);
     }
});

答案 2 :(得分:1)

首先,更容易在此块上打印堆栈跟踪而不是调试,以便能够在初始化RowFilter期间知道是否存在错误。

catch(java.util.regex.PatternSyntaxException ex) {
        ex.printStackTrace();
        return;
}

我找不到代码有什么问题,似乎问题在于正则表达式。因此,如果您可以针对您希望显示的行之一来测试键入JTextField的正则表达式,以查看它是否匹配: Javascript Regular Expression Validator