在进行长时间比较时更新JProgressBar

时间:2013-09-11 08:26:11

标签: java multithreading swing invokelater

我最近的项目遇到了一个严重的问题:我在一个名为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();

2 个答案:

答案 0 :(得分:1)

您的代码现在只在invokeLater返回后调用writer。这是因为invokeLater与实际工作在同一个线程中,因此两个语句将按顺序执行。您需要做的是从writer内安排进度条更新。如果您不希望使用接口更新逻辑来混淆writer,请考虑使用Observer模式。

答案 1 :(得分:1)

最终会更新,因为这是您更新它的地方。每次需要更新栏时,您需要执行bar.setValue()(在EDT中,就像您已经正确做的那样)。

更简洁的方法可能是使用SwingWorker。值更新后使用publish()。 SwingWorkers可以将多个更改合并到一个,您可以在process()中忽略除最后一个之外的所有更改(就像您可能希望的那样)。