如何异步触发JProgressBar?

2023-12-09

我有一个JButton(swing) 在里面JPanel,如果按下它,我将在其列表中的 for 循环上执行任务EDT thread。这样做时我需要更新JProgressBar.

问题是,当我按下 JButton 时,任务是在事件调度线程 (EDT) 中执行的。所以我无法更新JProgressBar它在主线程或 UI 线程中触发。

现在我无法获得源代码,因为我完全更改了它并尝试使用 Eclipse SWTJProgressBar当那个摇摆JButton被触发了,就变得混乱了。

现在我得到了invalid thread access错误,因为 Display 对象在单独的 UI 线程中运行。一次只有一个 SwingJPanel或 Eclipse SWTShell被显示。

我正在触发JPanel using JOptionPane.


Asynchronously处理JProgressBar使用进度SwingWorker详细使用两个Swing JButton btnStart and btnStop.

enter image description here

我们在这里获取源代码 -

package com.practice;

import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JProgressBar;
import javax.swing.SwingUtilities;
import javax.swing.SwingWorker;

public class ProgressExample {

    private static JFrame frame;
    private static JButton btnStart;
    private static JButton btnStop;
    private static JProgressBar progress;
    private static Integer currValue;
    private static boolean swingWorkerHelper;
    private static SwingWorker<Integer, Void> swingWorker;

    public static void main(String[] args) {
        // Scheduling Swing app for the event dispatch thread(EDT) Asynchronously
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                runSwingAsynchronousApp();
            }
        });
    }

    private static void runSwingAsynchronousApp() {
        currValue = new Integer(0);

        btnStart = new JButton("Start");
        btnStop = new JButton("Stop");

        progress = new JProgressBar();
        progress.setMinimum(0);
        progress.setMaximum(100);
        progress.setStringPainted(true);

        btnStart.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent evt) {

                if (btnStart.getText().equals("Pause")) {
                    // interrupting swingWorker method doInBackground() implicitly safely.
                    swingWorkerHelper = false;
                    btnStart.setText("Resume");
                } else {
                    if (btnStart.getText().equals("Start") || btnStart.getText().equals("Resume"))
                        btnStart.setText("Pause");

                    showProgress();
                }
            }
        });

        btnStop.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent evt) {
                // checking swingWorker Object is initialized or not
                if (swingWorker != null) {
                    // checking is swingWorker doing process in background or not
                    if (swingWorker.getState() == SwingWorker.StateValue.STARTED) {
                        btnStart.setText("Start");
                        // interrupting swingWorker method doInBackground() explicitly
                        swingWorker.cancel(true);
                        currValue = new Integer(0);
                    }
                }
            }
        });

        frame = new JFrame();
        frame.setTitle("Asynchronously trigger JProgressBar");
        frame.getContentPane().setLayout(new GridLayout(3, 2));
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setBounds(400, 250, 400, 300);

        frame.getContentPane().add(btnStart);
        frame.getContentPane().add(btnStop);
        frame.getContentPane().add(progress);

        frame.setVisible(true);
    }

    private static void showProgress() {
        swingWorker = new SwingWorker<Integer, Void>() {
            @Override
            protected Integer doInBackground() throws Exception {

                if (!swingWorkerHelper)
                    swingWorkerHelper = true;

                while (currValue < progress.getMaximum() && swingWorkerHelper) {
                    try {
                        progress.setValue(++currValue);

                        if (isCancelled())
                            return currValue;

                        Thread.sleep(70);
                    } catch (InterruptedException iex) {
                        swingWorkerHelper = false;
                        System.out.println("Stop Button interrupted SwingWorker process...");
                    }
                }
                return currValue;
            }

            @Override
            public void done() {
                System.out.printf("Progress ends with value %s " + 
                (isCancelled() ? "with" : "without") + " interruption.\n", currValue);
                if (currValue >= progress.getMaximum()) {
                    btnStart.setText("Start");
                    currValue = new Integer(0);
                }
            }
        };
        swingWorker.execute();
    }

}

希望这会对您有所帮助。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何异步触发JProgressBar? 的相关文章

随机推荐

  • h5py 编写:如何高效地将数百万个 .npy 数组写入 .hdf5 文件?

    我必须将大图像的子样本存储为 npy大小为 20 20 5 的数组 为了在训练分类模型时进行统一采样 我正在寻找一种有效的方法来存储近 1000 万个子样本 以实现这一点 如果我将它们存储为整个图像 则训练期间的采样将不能代表分布 我有存储
  • 在 ggplot2 中创建散点图矩阵(pairs() 等效项)

    是否可以绘制散点图矩阵ggplot2 using ggplot有哪些不错的功能 例如将其他因素映射到颜色 形状等并添加更平滑的功能 我正在考虑类似的事情base功能pairs 我一直想这样做 但绘图矩阵很糟糕 哈德利推荐使用GGally包反
  • C++ 标准是否包含必须包含的标准头文件?

    在 Visualstudio 上 标头 thread 包含以下所有标头 include
  • 视差滚动不适用于移动 CSS

    我的视差滚动不适用于移动设备 Android 和 iOS 该代码适用于桌面设备 但不适用于移动设备 无论是任何浏览器 背景图像不会以视差效果滚动 你可以在这里查看https dkpyk75z6sfdo cloudfront net 这是 C
  • 使用 URLRequestConvertible 的单元测试中出现链接错误

    我在为一个非常简单的函数编写简单的单元测试 Xcode 7 2 时遇到一个奇怪的问题 该函数确保将参数添加到 URL func appendToken token String toRequest request URLRequestCon
  • 如何使用 PHP 将 AVI 文件转换为 FLV 格式?

    是否可以使用 PHP 将 AVI 文件转换为 FLV 格式 如果是这样 怎么办 我不需要完整的解决方案 只需要有关如何执行此操作的提示 ffmpeg是一个很棒的图书馆 以下是该过程的演练 http vexxhost com blog 200
  • 在VBA中使用ADO连接到PostgreSQL

    我无法找到使用 VBA ADO 从 Excel 连接到 PostgreSQL 数据库的清晰可靠的示例 诚然 我是 VBA 新手 大多数示例和教程都非常以 Access 或 MSSQL 为中心 我主要使用 Ruby Rails Perl 和
  • 如何在 R 中按州创建分层样本

    如何使用 采样 包在 R 中创建分层样本 我的数据集有 355 000 个观察值 该代码直到最后一行都运行良好 下面是我编写的代码 但我总是收到以下消息 sort list y 中的错误 x 对于 sort list 必须是原子的 您是否在
  • 为什么“instanceof”运算符在传递给库的实例上返回 false? (不涉及继承)

    我正在用 TS 建立一个图书馆 该库使用ssh2库作为依赖项 我正在尝试创建一个可以接受ssh2配置对象或已经存在的Client执行命令的实例 这是一个简化的情况 import Client ConnectConfig from ssh2
  • Chrome 渲染问题。体内带有 UL 的固定位置锚

    使用以下代码时 Google Chrome 和 Opera 存在渲染问题 为什么 div a href s1 Link 1 a br a href s2 Link 2 a div div div
  • 接触外国安全负责人

    正在寻找用户 email protected 与 objectSidS 1 5 21 1234567890 123465789 123456789 123456 我只找到一个国外安全负责人CN S 1 5 21 1234567890 123
  • 使用数据列表进行多项选择

    我正在使用该标签为我的搜索框创建建议列表 但我无法从数据列表中选择多个值 目前 我的 HTML 是
  • 将键值对传递给 JavaScript 文件

    您可以将键值对传递给 JavaScript 文件吗 该技术由脚本性的 see line 54 您可以通过检查源来实现这一点script在你的页面上的元素中 我给你留下了一个独立于框架的功能 function getScriptVariabl
  • 推送通知在 iOS 10 中不显示

    如何在 iOS 10 中获取通知 在以前的版本中 我可以在以下位置收到通知func application application UIApplication didReceiveRemoteNotification userInfo NS
  • C++ 重载决策、转换运算符和 const

    在这种情况下 void f int void f const int int i f i 情况非常清楚 f int 被调用 这似乎是正确的 但是 如果我有这个 这是错误地完成的 class aa public operator bool c
  • delegate 类似于 mvc 控制器吗?

    我看到了这篇文章 http www cimgf com 2008 10 01 cocoa touch tutorial iphone application example 委托 控制器 委托和控制器这两个词可以同义使用 我不确定他在说什么
  • 如何从 Ruby 运行 Excel 宏?

    Problem 我有这本十多年前的 Excel 工作簿 其中有无数行 VBA 代码 其中一些我必须更新 所以我有了用 Ruby 编写单元测试的疯狂想法 Question 如何从 Ruby 调用 Excel 宏 到目前为止我所拥有的 I ha
  • 这个 State monad 代码是如何工作的?

    这段代码来自于此article 我一直能够遵循它直到这一部分 module Test where type State Int data ST a S State gt a State apply ST a gt State gt a St
  • 为什么我的 div 边距重叠以及如何修复它?

    我不明白为什么这些 div 的边距重叠 alignright float right header social margin top 50px header social a display inline block header soc
  • 如何异步触发JProgressBar?

    我有一个JButton swing 在里面JPanel 如果按下它 我将在其列表中的 for 循环上执行任务EDT thread 这样做时我需要更新JProgressBar 问题是 当我按下 JButton 时 任务是在事件调度线程 EDT