我该如何获取筛选后的模型?

9
我正在使用JTables显示用户可以过滤的信息,如果用户在过滤后保存,我希望将过滤后的表格保存到文本文件以进行持久化(意味着任何被过滤掉的内容都不会保存到文本文件中)。
对于过滤,我只是按照这个教程的过滤部分:http://download.oracle.com/javase/tutorial/uiswing/components/table.html#sorting,它运行良好,但我不确定是否有办法获取当前显示的模型,而不是包含所有未被过滤掉的内容的底层模型。
在我进行过滤的方式下,有没有办法实现这一点?
谢谢!
2个回答

17

使用 getRowCount() 方法获取表格的行数,该方法将返回经过筛选(可见)的行数。从 0 到 rowCount 循环迭代,使用 convertRowIndexToModel() 将每个行索引转换为模型索引,并向您的模型请求每个模型索引处的数据以构建已筛选(可见)数据列表。


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);
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接