我有一个 GUI 应用程序,它有几个选项卡,每个选项卡都承载一个JTable
. 我的 UI 类在 EDT 上运行的以下代码中处理来自控制器的事件:
private void processAnalysisResult(AnalysisResult generatedValue) {
LimitType limit = generatedValue.getMetric().getLimit();
String limitName = limit.getName();
int index = tabs.indexOfTab(limitName);
Component component = tabs.getComponentAt(index);
JScrollPane scrollPane = (JScrollPane) component;
JTable table = (JTable) scrollPane.getViewport().getView();
AnalysisResultTableModel model = (AnalysisResultTableModel) table.getModel();
model.addRow(generatedValue);
}
}
每秒有几千个新生成的结果,我将其降低到大约 10k。即使具有相对较低的值,应用程序也会冻结大约 10-20 秒来处理来自 Jtable 的 UI 更新。该addRow
方法在插入每一行时调用fireTableRowsInserted
mewthod,但这会那么慢吗?
编辑:这是处理事件的代码(从后台处理线程异步调用):
controller.addAnalysisGenerationListener(new GeneratedValueListener<AnalysisResult>() {
@Override
public void valueGenerated(final GeneratedValueEvent<AnalysisResult> event) {
processEDT(new Runnable() {
@Override
public void run() {
processAnalysisResult(event.getGeneratedValue());
}
});
}
});
private void processEDT(Runnable runnable) {
if (EventQueue.isDispatchThread()) {
runnable.run();
} else {
SwingUtilities.invokeLater(runnable);
}
}