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