首页 > 解决方案 > 如何将行添加到过滤的 JTable?

问题描述

我正在尝试将行添加到过滤的 JTable。但我发现了一些奇怪的行为。当我尝试将行添加到过滤后的 JTable 时,花费的时间比预期的要长。

没有过滤器需要几毫秒,但过滤器需要几十秒。

出了什么问题,我该如何解决?

public class Main {

public static void main(String[] args) {
    SwingUtilities.invokeLater(Main::new);
}

public Main() {
    JFrame frame = new JFrame();
    frame.setLayout(new BorderLayout());

    DefaultTableModel model = new DefaultTableModel();
    model.setDataVector(null, new Object[]{"Col 1", "Col2"});

    JTable table = new JTable(model);
    TableRowSorter<TableModel> sorter = new TableRowSorter<>(table.getModel());
    table.setRowSorter(sorter);

    frame.add(new JScrollPane(table), BorderLayout.CENTER);

    JPanel buttonPanel = new JPanel(new BorderLayout());
    JButton setFilterButton = new JButton("Set Filter");
    setFilterButton.addActionListener(e -> {
        sorter.setRowFilter(RowFilter.regexFilter("Hello"));
    });
    buttonPanel.add(setFilterButton, BorderLayout.CENTER);

    JButton removeFilterButton = new JButton("Remove Filter");
    removeFilterButton.addActionListener(e -> {
        sorter.setRowFilter(null);
    });
    buttonPanel.add(removeFilterButton, BorderLayout.EAST);

    JButton addRowButton = new JButton("Add rows");
    addRowButton.addActionListener(e -> {
        Instant start = Instant.now();
        for (int i = 0; i < 10000; i++) {
            model.insertRow(model.getRowCount(), new Object[]{model.getRowCount(), "Hello"});
            model.insertRow(model.getRowCount(), new Object[]{model.getRowCount(), "World"});
        }
        Duration timeElapsed = Duration.between(start, Instant.now());
        System.out.println("Add row, Filter: " + sorter.getRowFilter() + ", Time taken: "+ timeElapsed.toMillis() +" milliseconds");
    });
    buttonPanel.add(addRowButton, BorderLayout.WEST);

    frame.add(buttonPanel, BorderLayout.SOUTH);

    frame.setSize(300, 500);
    frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    frame.setVisible(true);
}
}

结果

Add row, Filter: null, Time taken: 31 milliseconds
Add row, Filter: null, Time taken: 15 milliseconds
set filter
Add row, Filter: javax.swing.RowFilter$RegexFilter@778daa62, Time taken: 2645 milliseconds

此外,这个过滤器也需要很长时间。

RowFilter<Object,Object> filter = new RowFilter<Object,Object>() {
    public boolean include(Entry<? extends Object, ? extends Object> entry) {
        return true;
    }
};
sorter.setRowFilter(filter);

结果

Add row, Filter: com.ssh.Main$1@2d74fcb1, Time taken: 883 milliseconds
Add row, Filter: com.ssh.Main$1@2d74fcb1, Time taken: 2066 milliseconds
Add row, Filter: com.ssh.Main$1@2d74fcb1, Time taken: 3535 milliseconds

标签: javaswingjtabletablerowsorter

解决方案


推荐阅读