选中了用于过滤JTable的按钮

我有一个与此相似的JTable。

http://docs.oracle.com/javase/tutorial/uiswing/components/table.html#sorting

表

我已经设法在它上面设置了一个普通的filter(一个搜索function),它运行良好。 我想要一个按钮,它会立即显示检查素食的行。

好的,现在感谢@peeskillet和@HovercraftFullOfEels提供的帮助,这是我的问题的解决方案:

final TableRowSorter rowSorter = new TableRowSorter(tableModel); // custom RowFilter RowFilter filter = new RowFilter() { // include method returns true to show the row and false to not show it @Override public boolean include(RowFilter.Entry entry) { int modelRow = entry.getIdentifier(); //row index boolean checked = ((Boolean)entry.getModel().getValueAt(modelRow, 3)).booleanValue(); System.out.println(checked); // to test the values coming through return checked; } }; table.setRowSorter(rowSorter); JButton onlyFeatured = new JButton("Only show Featured"); threeButtonPanel.add(onlyFeatured); onlyFeatured.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent event) { rowSorter.setRowFilter(filter); } }); 

有用! 非常感谢你们,我欠你们的饮料。 :d

让我们重新阅读教程如何使用表格:排序和过滤 。

除了重新排序结果外,表分类器还可以指定要显示的行。 这称为过滤。 TableRowSorter使用javax.swing.RowFilter对象实现过滤。 RowFilter实现了几种创建常见filter的工厂方法。

要看的东西:

  • TableRowSorter 。 – 我们知道我们需要这个。
  • 哦,他们给了我们RowFilter文档的链接。 让我们在新的浏览器选项卡中打开它。
  • 但首先是最后一行RowFilter实现了几种创建常见filter的工厂方法”。 。 我们应该看看那些“常见种类”是什么。

RowFilter javadoc

  • 静态方法 – andFilterdateFilternotFilternumberFilterorFilterregexFilter 。 好的,我从教程中认识到了regexFilter 。 但其他人,仅凭他们的名字,听起来并不太有希望。 也许我们应该实施自己的。 让我们看看javadoc的其余部分

javax.swing.RowFilter

类型参数:
M – 模型的类型; 例如PersonModel
I – 标识符的类型; 当使用TableRowSorter这将是Integer

好的,我们知道两件事。 当我们创建自定义RowFilter ,我们应该将TableModel类型作为第一个参数传递,并输入Integer来表示行号。

RowFilter用于过滤模型中的条目,以便它们不会显示在视图中。 例如,与JTable关联的RowFilter可能只允许包含具有特定字符串的列的行。 条目的含义取决于组件类型。 例如,当filter与JTable相关联时,条目对应于一行; 当与JTree相关联时,条目对应于节点。

子类必须覆盖include方法,以指示是否应在视图中显示该条目。 Entry参数可用于获取该Entry中每个列中的值

所以基于这两个段落,我们知道RowFilter用于过滤掉我们在视图中不需要的行,如果我们创建自己的行,我们将需要覆盖include方法来返回是否应该显示一行或不。 并且include方法将具有Entry参数,在确定哪一行不返回true时,我们可以从中获取可能对我们感兴趣的细节。 这是javadoc给出的基本示例(指南)

 RowFilter filter = new RowFilter() { @Override public boolean include(RowFilter.Entry entry) { // do your logic here to return true or false. } }; 

很酷,但是这个RowFilter.Entry类是什么,它可以为我们提供哪些有趣的信息? 我们来看看javadoc 。

我们可以看到一个有趣的事情是getModel()方法。 从那我们可以获得我们的表模型。 所以让我们完成实施

 private static final int CHECKBOX_COLUMN = 4; ... RowFilter filter = new RowFilter() { @Override public boolean include(RowFilter.Entry entry) { int modelRow = entry.getIdentifier(); Boolean checked = (Boolean)entry.getModel().getValueAt(modelRow, CHECKBOX_COLUMN); return checked; } }; 

它也不多。 现在剩下的就是将filter设置为分拣机,正如您从Oracle教程中学到的那样,使用正则表达式filter。

这是一个填充演示代码。 它没有为按下按钮实现ActionListener 。 我不想为你做任何事情 。 你应该有足够的信息来自己解决这个问题:-快乐学习!

 import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.RowFilter; import javax.swing.SwingUtilities; import javax.swing.table.DefaultTableModel; import javax.swing.table.TableModel; import javax.swing.table.TableRowSorter; public class TableBooleanFilterDemo { public TableBooleanFilterDemo() { JTable table = getTable(); TableRowSorter rowSorter = new TableRowSorter<>(table.getModel()); RowFilter filter = getRowFilter(); rowSorter.setRowFilter(filter); table.setRowSorter(rowSorter); JFrame frame = new JFrame(); frame.add(new JScrollPane(table)); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.pack(); frame.setLocationByPlatform(true); frame.setVisible(true); } private static final int CHECKBOX_COLUMN = 4; private RowFilter getRowFilter() { RowFilter filter = new RowFilter() { @Override public boolean include(RowFilter.Entry entry) { int modelRow = entry.getIdentifier(); Boolean checked = (Boolean)entry.getModel().getValueAt(modelRow, CHECKBOX_COLUMN); return checked; } }; return filter; } private JTable getTable() { Object[][] data = { {"Kathy", "Smith", "Snowboarding", new Integer(5), new Boolean(false)}, {"John", "Doe", "Rowing", new Integer(3), new Boolean(true)}, {"Sue", "Black", "Knitting", new Integer(2), new Boolean(false)}, {"Jane", "White", "Speed reading", new Integer(20), new Boolean(true)}, {"Joe", "Brown", "Pool", new Integer(10), new Boolean(false)} }; String[] columnNames = {"First Name", "Last Name", "Sport", "# of Years", "Vegetarian"}; return new JTable(new DefaultTableModel(data, columnNames) { public Class getColumnClass(int c) { return getValueAt(0, c).getClass(); } }); } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable(){ public void run() { new TableBooleanFilterDemo(); } }); } } 

说实话,我从来没有必要实现自己的RowFilter ,但上面是我在尝试学习新东西时经历的过程。 花了我更长的时间来写这个答案,然后学习如何去做。 要学会阅读文档,而不仅仅是教程。 教程是一个很好的起点,但是一旦你遇到更复杂的问题,你需要深入挖掘。 与您想要学习的任何新技术相同。

你的RowFilter太简单了,相反,你需要给它更多的重量,更多的肉。 RowFilter API实际上有一些非常有用的示例代码可以帮助您。 例如,我使用该代码来帮助我创建一个非常简单但可行的RowFilter:

 import java.awt.BorderLayout; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import javax.swing.*; import javax.swing.table.DefaultTableModel; import javax.swing.table.TableRowSorter; public class Foo { public static void main(String[] args) { String[] petStrings = { "Bird", "Cat", "Dog", "Rabbit", "Pig" }; JComboBox petCombo = new JComboBox<>(petStrings); String[] columnNames = {"Name", "Animal", "Male", "Delete"}; Object[][] data = { {"Tweetie", petStrings[0], false, null}, {"Sylvester", petStrings[1], true, null}, {"Lassie", petStrings[2], false, null}, {"Peter", petStrings[3], true, null}, {"Arnold", petStrings[4], true, null} }; final MyTableModel model = new MyTableModel(data, columnNames); final JTable table = new JTable(model); table.getColumnModel().getColumn(1).setCellEditor(new DefaultCellEditor(petCombo)); final TableRowSorter sorter = new TableRowSorter(model); final RowFilter maleSexFilter = new RowFilter() { public boolean include(Entry entry) { MyTableModel personModel = entry.getModel(); boolean maleSex = ((Boolean) personModel.getValueAt(entry.getIdentifier(), 2)).booleanValue(); return maleSex; } }; sorter.setRowFilter(null); table.setRowSorter(sorter); JToggleButton showMalesButton = new JToggleButton("Show Males"); showMalesButton.addItemListener(new ItemListener() { @Override public void itemStateChanged(ItemEvent iEvt) { if (iEvt.getStateChange() == ItemEvent.SELECTED) { System.out.println("selected!"); sorter.setRowFilter(maleSexFilter); } else { sorter.setRowFilter(null); } } }); JPanel bottomPanel = new JPanel(); bottomPanel.add(showMalesButton); JPanel panel = new JPanel(new BorderLayout()); panel.add(new JScrollPane(table), BorderLayout.CENTER); panel.add(bottomPanel, BorderLayout.PAGE_END); JOptionPane.showMessageDialog(null, panel); } } @SuppressWarnings("serial") class MyTableModel extends DefaultTableModel { public MyTableModel(Object[][] data, String[] columnNames) { super(data, columnNames); } @Override public Class getColumnClass(int columnIndex) { if (columnIndex == 2) { return Boolean.class; } return super.getColumnClass(columnIndex); } } 

filter代码是:

  final RowFilter maleSexFilter = new RowFilter() { public boolean include(Entry entry) { MyTableModel personModel = entry.getModel(); boolean maleSex = ((Boolean) personModel.getValueAt(entry.getIdentifier(), 2)).booleanValue(); return maleSex; } }; 

我所做的就是得到第二列所保持的布尔值,由entry.getIdentifier()确定的行,并返回该值。 如果为true,则选择它。