我有一个与此非常相似的JTable。
http://docs.oracle.com/javase/tutorial/uiswing/components/table.html#sorting
我已经设法在其上设置了普通过滤器(搜索功能),并且效果很好。我想要一个按钮,该按钮将立即仅显示选中素食的行。
好吧,现在感谢@peeskillet和@HovercraftFullOfEels提供的帮助,这是解决我的问题的方法:
final TableRowSorter<MovieReviewTableModel> rowSorter = new TableRowSorter<MovieReviewTableModel>(tableModel); // custom RowFilter RowFilter<MovieReviewTableModel, Integer> filter = new RowFilter<MovieReviewTableModel, Integer>() { // include method returns true to show the row and false to not show it @Override public boolean include(RowFilter.Entry<? extends MovieReviewTableModel, ? extends Integer> 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实现几种创建通用过滤器的工厂方法。
TableRowSorter
RowFilter
要看的东西:
RowFilter javadoc
andFilter
dateFilter
notFilter
numberFilter
orFilter
regexFilter
javax.swing.RowFilter<M,I> 类型参数: M-模型的类型;例如PersonModel I-标识符的类型;使用时TableRowSorter将是Integer
javax.swing.RowFilter<M,I>
类型参数: M-模型的类型;例如PersonModel I-标识符的类型;使用时TableRowSorter将是Integer
M
PersonModel
I
Integer
好的,因此我们知道两件事。创建custom时RowFilter,应将TableModel类型作为第一个参数,并键入Integer以代表行号。
TableModel
RowFilter用于过滤模型中的条目,以使它们不会显示在视图中。例如,与的RowFilter关联JTable可能只允许包含具有特定字符串的列的行。条目的含义取决于组件类型。例如,当过滤器与关联时JTable,条目对应于一行;当与a关联时JTree,条目对应于一个节点。 子类必须重写此include方法,以指示是否应在视图中显示该条目。该Entry参数可用于获取该条目中每个列中的值
RowFilter用于过滤模型中的条目,以使它们不会显示在视图中。例如,与的RowFilter关联JTable可能只允许包含具有特定字符串的列的行。条目的含义取决于组件类型。例如,当过滤器与关联时JTable,条目对应于一行;当与a关联时JTree,条目对应于一个节点。
JTable
JTree
子类必须重写此include方法,以指示是否应在视图中显示该条目。该Entry参数可用于获取该条目中每个列中的值
include
Entry
因此,基于这两个参数,我们知道了RowFilter用来过滤视图中不需要的行,并且如果我们创建自己的行,则需要重写该include方法以返回是否应显示行。 。而且该include方法还将具有一个Entry参数,当确定哪一行不返回true时,我们可以从中获取我们可能感兴趣的详细信息。这是javadoc给我们的基本示例(准则)
RowFilter<TableModel, Integer> filter = new RowFilter<TableModel, Integer>() { @Override public boolean include(RowFilter.Entry<? extends TableModel, ? extends Integer> entry) { // do your logic here to return true or false. } };
很酷,但是什么是此类RowFilter.Entry,它可以为我们提供什么有趣的信息?让我们看一下javadoc。
RowFilter.Entry
我们可以看到的一件有趣的事情是getModel()方法。由此我们可以得到表模型。现在让我们完成实施
getModel()
private static final int CHECKBOX_COLUMN = 4; ... RowFilter<TableModel, Integer> filter = new RowFilter<TableModel, Integer>() { @Override public boolean include(RowFilter.Entry<? extends TableModel, ? extends Integer> entry) { int modelRow = entry.getIdentifier(); Boolean checked = (Boolean)entry.getModel().getValueAt(modelRow, CHECKBOX_COLUMN); return checked; } };
也不多。现在,剩下的就是使用正则表达式过滤器,将过滤器设置为排序器,正如您已经从Oracle教程中学到的那样。
这是填充演示代码。它没有ActionListener为按钮按下实现。我不想为你做 任何事情 。您应该有足够的信息来自己处理:-D快乐学习!
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<TableModel> 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<TableModel, Integer> filter = new RowFilter<TableModel, Integer>() { @Override public boolean include(RowFilter.Entry<? extends TableModel, ? extends Integer> 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,但是以上就是我尝试学习新东西时要经历的过程。让我花了更长的时间写这个答案,然后学习如何做。要学会阅读文档,而不仅仅是教程。教程是一个很好的起点,但是一旦您遇到更复杂的问题,就需要更深入地研究。与您要学习的任何新技术相同。