java - 如何将行添加到过滤的 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
解决方案
推荐阅读
- python - 如何在没有服务器的情况下保持不和谐机器人在线
- java - 如何将修改(创建、更新 OWL 文件)保存到 fuseki 服务器
- javascript - 根据下拉选项值更改表单选择名称
- python - Loading python packages when using conda enviroment with vim python-mode
- css - Angular 6 not applying scss styles
- php - 需要时跟进[如何检查JSON对象是否为空或值] = true
- javascript - Typescript passing Function as parameter
- python - Python Plotly Heatmap Datetime 仅显示部分
- r - 变异函数中的 GREP
- javascript - form.checkValidity 检查两个密码字段是否匹配