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

标签 java multithreading swing invokelater

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

最佳答案

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

也许,更简洁的方法是使用 SwingWorker 。当值更新时使用publish()。 SwingWorkers 可以将多个更改合并为一个,并且您可以在 process() 中忽略除最后一个更改之外的所有更改(就像您在您的情况下可能想要做的那样)。

关于java - 在进行长时间比较时更新 JProgressBar,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18736179/

相关文章:

java - Java 中 ConcurrentHashMap 的多线程

java - 表格单元格编辑器在调用 editCellAt 时确实显示编辑光标

java - Tomcat 版本 7 是否已完全准备好用于生产

java - 执行器 corepoolsize 为零,且 LinkedBlockingQueue 有限

java - 在servlet中获取部分请求url

C++ OpenMP for循环全局变量问题

java - 使 JLabel 背景在有背景的框架中透明

java - 如何将 JLabel 放置在右上角标题栏下方?

java - 如何从匿名内部类更改 side 方法中的变量值?

java - Java 中的 C 源代码 AST 解析器