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



我最近的项目遇到了一个严重的问题:我正在用一种名为 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 模式。

最新更新