【问题标题】:JTable filtering with JTextField doesn't work使用 JTextField 进行 JTable 过滤不起作用
【发布时间】:2011-10-27 09:27:33
【问题描述】:

我有一个 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()。

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

真诚地, 迈克尔

【问题讨论】:

    标签: java swing jtable filtering


    【解决方案1】:

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

    对于不区分大小写,您必须设置 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】:

    JTable 和 TableRowSorter 似乎各有不同的表模型。 TableRowSorter 应该使用 JTable 的表模型来构建。

    【讨论】:

    • 我为用于 JTable 的表模型创建了一个变量。然后我使用了_sorter = new TableRowSorter&lt;DefaultTableModel&gt;(_model);,现在它可以工作了。非常感谢!
    【解决方案3】:

    起初,在这个块上打印堆栈跟踪比调试更容易,以便能够知道在初始化 RowFilter 期间是否有错误。

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

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

    【讨论】:

    • 这意味着 .* 应该显示所有行,对吗?也没有打印堆栈跟踪,所以它应该可以工作。
    猜你喜欢
    • 2013-10-22
    • 1970-01-01
    • 2013-06-22
    • 2011-12-11
    • 2012-02-21
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多