【问题标题】:Java JTable - show rows only which matches the stringJava JTable - 仅显示与字符串匹配的行
【发布时间】:2014-06-15 09:27:55
【问题描述】:

我有一个JTable 填充了数据库中的数据。我添加了一个显示行的搜索功能,如果在将数据输入JTextField 时,单词与某些行匹配。但是,当您键入与任何行数据都不匹配的字符串或单词时,我想做的是隐藏所有行,JTable 将只显示列名。就像某些内容与 IT 匹配时,仅显示具有用户键入的字符串的行并隐藏其他行。

这是我正在使用的代码:

               if (text.length() == 0) {
                 sorter.setRowFilter(null);
               } else {
                 try {
                   sorter.setRowFilter(
                       RowFilter.regexFilter(text));
                 } catch (PatternSyntaxException pse) {
                   System.err.println("Bad regex pattern");
                 }
               }
             }

【问题讨论】:

标签: java swing jtable rowsorter


【解决方案1】:

您想使用DocumentListener 以及行过滤器。你可以看到如何Write a DocumentListener

基本上,监听器监听文本字段底层文档的变化。从您在DocumentListener 中覆盖的方法中,您可以获得文本,就像您当前正在做的那样,并像您当前正在做的那样设置正则表达式 ex 过滤器

这是一个简单的例子(忽略小程序。我刚刚从this post 获得样板代码并添加了文档侦听器)。注意:同一篇文章提供了一个答案,如果您正在寻找该功能,该答案将允许您以不区分大小写的方式进行过滤

import javax.swing.JApplet;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.RowFilter;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.table.TableModel;
import javax.swing.table.TableRowSorter;

public class TestTableSorterFilter extends JApplet {

    private String[] columnNames
            = {"Country", "Capital", "Population in Millions", "Democracy"};

    private Object[][] data = {
        {"USA", "Washington DC", 280, true},
        {"Canada", "Ottawa", 32, true},
        {"United Kingdom", "London", 60, true},
        {"Germany", "Berlin", 83, true},
        {"France", "Paris", 60, true},
        {"Norway", "Oslo", 4.5, true},
        {"India", "New Delhi", 1046, true}
    };

    private JTable jTable = new JTable(data, columnNames);

    private TableRowSorter<TableModel> rowSorter
            = new TableRowSorter<>(jTable.getModel());

    private JTextField jtfFilter = new JTextField();
    private JButton jbtFilter = new JButton("Filter");

    public TestTableSorterFilter() {
        jTable.setRowSorter(rowSorter);

        JPanel panel = new JPanel(new BorderLayout());
        panel.add(new JLabel("Specify a word to match:"),
                BorderLayout.WEST);
        panel.add(jtfFilter, BorderLayout.CENTER);

        add(panel, BorderLayout.SOUTH);
        add(new JScrollPane(jTable), BorderLayout.CENTER);

        jtfFilter.getDocument().addDocumentListener(new DocumentListener(){

            @Override
            public void changedUpdate(DocumentEvent arg0) {}

            @Override
            public void insertUpdate(DocumentEvent arg0) {
                String text = jtfFilter.getText();

                if (text.trim().length() == 0) {
                    rowSorter.setRowFilter(null);
                } else {
                    rowSorter.setRowFilter(RowFilter.regexFilter(text));
                }   
            }

            @Override
            public void removeUpdate(DocumentEvent arg0) {
                String text = jtfFilter.getText();
                if (text.trim().length() == 0) {
                    rowSorter.setRowFilter(null);
                } else {
                    rowSorter.setRowFilter(RowFilter.regexFilter(text));
                }   
            }
        });
    }
}

【讨论】:

  • +1 但我认为应该是rowFilter = RowFilter.regexFilter("(?i)" + filterText);,其中“(?i)”不区分大小写,接受大写和情人字符的方式相同
  • @mKorbel 我发布了我提出的问题的链接,它显示了如何做到这一点:)
  • 嗯,很好,因为有时我会离开阅读说明
  • 或者您可以查看 Sorting and Filtering 上的 Swing 教程,该教程有一个工作示例,该示例与解释完全一致。
猜你喜欢
  • 2018-01-01
  • 1970-01-01
  • 2021-04-16
  • 1970-01-01
  • 1970-01-01
  • 2015-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多