如何获得过滤后的模型?

我正在使用JTables显示用户可以过滤的信息,如果用户在过滤后保存,我想将过滤后的表保存到文本文件中以保持持久性(意味着任何过滤掉的内容都不会保存到文本文件中)。

对于过滤我只是按照本教程的过滤部分: http : //download.oracle.com/javase/tutorial/uiswing/components/table.html#sorting并且它工作正常,但我不确定是否有任何方法我可以获得当前显示的模型,而不是包含尚未过滤掉的所有内容的基础模型。

有什么方法可以用我过滤的方式来做到这一点吗?

谢谢!

向表中询问其行数(使用getRowCount() ),这将返回已过滤(可见)行的数量。 从0到rowCount迭代,使用convertRowIndexToModel()将每个行索引转换为模型索引,并向模型询问每个模型索引处的数据以构建过滤(可见)数据的列表。

此代码显示了如何执行此操作。 请注意,按下按钮后,B行不会打印到输入。

 import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.RowFilter; import javax.swing.table.DefaultTableModel; import javax.swing.table.TableModel; import javax.swing.table.TableRowSorter; import javax.swing.JButton; import java.awt.BorderLayout; import java.awt.event.ActionListener; import java.awt.event.ActionEvent; public class JTableFilterDemo { public static void main(String[] args) { Object[][] data = { { "A", 5 }, { "B", 2 }, { "C", 4 }, { "D", 8 } }; String columnNames[] = { "Item", "Value" }; TableModel model = new DefaultTableModel(data, columnNames) { public Class getColumnClass(int column) { return getValueAt(0, column).getClass(); } }; JTable table = new JTable(model); RowFilter filter = new RowFilter() { public boolean include(Entry entry) { Integer population = (Integer) entry.getValue(1); return population.intValue() > 3; } }; TableRowSorter sorter = new TableRowSorter( model); sorter.setRowFilter(filter); table.setRowSorter(sorter); JScrollPane scrollPane = new JScrollPane(table); JFrame frame = new JFrame("Filtering Table"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JButton btnNewButton = new JButton("Print values"); btnNewButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { for(int row = 0;row < table.getRowCount();row++) { System.out.println(table.getModel().getValueAt(table.convertRowIndexToModel(row), 0)); } } }); frame.getContentPane().add(btnNewButton, BorderLayout.SOUTH); frame.getContentPane().add(scrollPane); frame.setSize(300, 200); frame.setVisible(true); } }