0

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

线程是通过一个按钮的 ActionListener 启动的

t.start();
4

2 回答 2

1

您现在的代码invokeLater仅在writer返回后才调用。这是因为invokeLater与实际工作在同一个线程中,所以两条语句都会按顺序执行。您需要做的是从writer. 如果您不想让writer接口更新逻辑混乱,请考虑使用观察者模式。

于 2013-09-11T08:32:22.870 回答
1

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

也许,更清洁的方法是使用SwingWorkerpublish()在值已更新时使用。SwingWorkers 可以将多个更改合并为一个,并且您可以忽略process().

于 2013-09-11T08:32:49.713 回答