我最近的项目遇到了一个严重的问题:我正在用一种名为 writer(...) 的方法进行长时间比较,大约需要 20 秒。该方法在 View 类中贴花,其中也设置了我的 GUI 元素。当方法进行比较时,我想更新进度条,但无论如何我这样做,当方法完成比较时,它总是会更新......有什么想法吗?
这是我的代码(好的 - 部分代码):
Thread t = new Thread(new Runnable()
{
public void run()
{
writer(List1, List2);
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
bar.setValue(SOME_VALUE);
}
});
}
});
线程ist通过按钮的ActionListener启动
t.start();
它最终会更新,因为那是您更新它的地方。每次需要更新栏时,您都需要执行bar.setValue()
(在 EDT 中,就像您已经正确执行的那样)。
也许,一个更清洁的方法是使用SwingWorker。在值更新时使用publish()
。SwingWorkers 可以将多个更改合并为一个,并且您可以在 process()
中忽略除最后一个更改之外的所有更改(就像您可能想在自己的情况下所做的那样)。
您的代码现在仅在writer
返回后调用invokeLater
。这是因为invokeLater
与实际工作位于同一线程中,因此这两个语句将按顺序执行。您需要做的是从writer
内安排进度条更新。如果不想用接口更新逻辑使writer
混乱,请考虑使用 Observer 模式。