我正在使用JTables显示用户可以过滤的信息,如果用户在过滤后保存,我想将过滤后的表保存到文本文件中以保持持久性(意味着任何过滤掉的内容都不会保存到文本文件中) )。
对于过滤我只是按照本教程的过滤部分:http://download.oracle.com/javase/tutorial/uiswing/components/table.html#sorting并且它工作正常,但我不确定我能获得当前显示的模型而不是基础模型包含尚未过滤掉的所有内容。
有没有办法用我过滤的方式做到这一点?
谢谢!
答案 0 :(得分:16)
向表格询问其行数(使用getRowCount()
),这将返回已过滤(可见)行的数量。从0到rowCount迭代,使用convertRowIndexToModel()
将每个行索引转换为模型索引,并向模型询问每个模型索引处的数据,以构建过滤(可见)数据列表。
答案 1 :(得分:2)
此代码显示了如何执行此操作。请注意,按下按钮后,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<Object, Object> filter = new RowFilter<Object, Object>() {
public boolean include(Entry entry) {
Integer population = (Integer) entry.getValue(1);
return population.intValue() > 3;
}
};
TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>(
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);
}
}