Java JTable – 仅显示与字符串匹配的行

我有一个JTable填充了数据库中的数据。 我添加了一个显示行的搜索function,如果在将数据输入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"); } } } 

您想要使用DocumentListener以及行filter。 您可以看到如何编写DocumentListener 。

基本上,侦听器侦听文本字段的基础文档中的更改。 从您在DocumentListener覆盖的方法,您可以获得文本,就像您当前正在做的那样,并设置正如您目前所做的那样的正则表达式filter

这是一个简单的例子(忽略applet。我刚刚从这篇文章中获得了样板代码并添加了文档监听器)。 注意:如果您正在寻找该function,那么相同的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 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)); } } }); } }