gpt4 book ai didi

java - JTable - UI 在多次插入时卡住

转载 作者:行者123 更新时间:2023-12-01 06:45:53 24 4
gpt4 key购买 nike

我有一个 GUI 应用程序,它有几个选项卡,每个选项卡托管一个 JTable。我的 UI 类在以下代码中处理来自 Controller 的事件,该代码在 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);
}
}

每秒有几千个新生成的结果,atm 我将其降低到大约 10k。即使值相对较低,应用程序也会在处理来自 Jtable 的 UI 更新时卡住大约 10-20 秒。 addRow 方法在插入每一行时调用 fireTableRowsInserted 方法,但这会这么慢吗?

编辑:这是处理事件的代码(从后台处理线程异步调用):

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

最佳答案

是的,它可能会那么慢。 10k并不是一个小数字。正如您已经注意到 addRow() 调用 fireTableRowsInserted() ,它反过来通知 View 发生了更改并使 View 刷新(但在这种情况下,用户不会刷新 View )看不到它是因为 EDT 正忙于处理下一个结果)。解决方案之一是在后台线程上执行 processAnalysisResult() ,并通过将最后一行 (model.addRow( generatedValue);) 传递给 来更新 EDT 上的模型>SwingUtilities.invokeLater()。也许不会快很多,但至少 GUI 不会卡住 20 秒。当然,您也可以使用专用于此类任务的 SwingWorker。此外,您可以尝试批量更新模型(例如,在 EDT 上一次将每 100 个结果添加到模型中),这应该最大限度地减少屏幕闪烁。

关于java - JTable - UI 在多次插入时卡住,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14232760/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com