Java 如何异步触发JProgressBar?

Java 如何异步触发JProgressBar?,java,swing,swt,jprogressbar,Java,Swing,Swt,Jprogressbar,我在JPanel中有一个JButton(swing),如果按下该按钮,我将在其EDT线程中的列表上的for循环上执行任务。执行此操作时,我需要更新JProgressBar 问题是,当我按下JButton时,任务是在事件调度线程(EDT)中执行的。因此,我无法更新在主线程或UI线程中触发的JProgressBar 现在源代码在我这里不可用,因为我完全更改了它,并尝试将Eclipse SWT用于JProgressBar当SwingJButton被触发时,它会变得混乱 现在我得到了无效的线程访问错误,

我在
JPanel
中有一个
JButton
swing
),如果按下该按钮,我将在其
EDT线程中的列表上的for循环上执行任务。执行此操作时,我需要更新
JProgressBar

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

现在源代码在我这里不可用,因为我完全更改了它,并尝试将Eclipse SWT用于
JProgressBar
当Swing
JButton
被触发时,它会变得混乱

现在我得到了
无效的线程访问
错误,因为Display对象在单独的UI线程中运行。一次只能显示Swing
JPanel
或eclipseswt
Shell


我正在使用
JOptionPane
触发
JPanel

您需要执行长时间运行的作业,并在
EDT
的单独线程中更新进度条值。大多数情况下,
SwingWorker
是一个很好的方法。因此,在该按钮的
ActionListener
中,您应该将长时间运行的线程与EDT分开。您可以使用裸
线程
执行此操作,但Workers和专门为此类情况设计的
SwingWorker

package graphics;

import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

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

public class GraphicDev extends JFrame{

    private static final long serialVersionUID = 679207429168581441L;
    //
    private static final int FRAME_WIDTH = 300;
    private static final int FRAME_HEIGHT = 100;

    private int percent;
    private JProgressBar progress;

    public GraphicDev() {
        Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
        setBounds(dim.width/2-FRAME_WIDTH/2, dim.height/2-FRAME_HEIGHT/2, FRAME_WIDTH, FRAME_HEIGHT);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        //
        setLayout(new FlowLayout());
        //
        progress = new JProgressBar(0, 100);
        progress.setStringPainted(true);
        //
        JButton actButton = new JButton("Start!");
        actButton.addActionListener(new ActionListener() {          
            @Override
            public void actionPerformed(ActionEvent e) {
                new SwingWorker<Void, Void>() {
                    @Override
                    protected Void doInBackground() throws Exception {
                        for (long i = 0; i < 10000000000000L; i++) {
                            System.out.println(i);
                            if(i%200000 == 0){
                                progress.setValue(percent++);
                            }
                            if(percent >= 100){
                                break;
                            }
                        }
                        return null;
                    }

                    @Override
                    protected void done() {
                        JOptionPane.showMessageDialog(GraphicDev.this, "Done!");
                    }

                }.execute();    
            }
        });
        //
        add(actButton);
        add(progress);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                GraphicDev g = new GraphicDev();
                g.setVisible(true);
            }
        });
    }
}
封装图形;
导入java.awt.Dimension;
导入java.awt.FlowLayout;
导入java.awt.Toolkit;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入javax.swing.JButton;
导入javax.swing.JFrame;
导入javax.swing.JOptionPane;
导入javax.swing.JProgressBar;
导入javax.swing.SwingUtilities;
导入javax.swing.SwingWorker;
公共类GraphicDev扩展了JFrame{
私有静态最终长serialVersionUID=679207429168581441L;
//
私有静态最终整数帧_宽度=300;
专用静态最终整型帧_高度=100;
私人机构占百分之几;
私人酒吧进展;
公共图形开发(){
维度dim=Toolkit.getDefaultToolkit().getScreenSize();
立根(尺寸宽度/2-框宽/2,尺寸高度/2-框高/2,框宽,框高);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//
setLayout(新的FlowLayout());
//
进度=新的JProgressBar(0,100);
进度。设置字符串绘制(真);
//
JButton actButton=新JButton(“开始!”);
actButton.addActionListener(新ActionListener(){
@凌驾
已执行的公共无效操作(操作事件e){
新SwingWorker(){
@凌驾
受保护的Void doInBackground()引发异常{
对于(长i=0;i<100000000000L;i++){
系统输出打印LN(i);
如果(i%200000==0){
进度。设置值(百分比++);
}
如果(百分比>=100){
打破
}
}
返回null;
}
@凌驾
受保护的void done(){
showMessageDialog(GraphicDev.this,“完成!”);
}
}.execute();
}
});
//
添加(actButton);
增加(进度);
}
公共静态void main(字符串[]args){
SwingUtilities.invokeLater(新的Runnable(){
@凌驾
公开募捐{
GraphicDev g=新的GraphicDev();
g、 setVisible(真);
}
});
}
}

希望这会有所帮助。

异步处理
JProgressBar
使用
SwingWorker
进展,详细介绍使用两个
Swing JButton btnStart和btnStop

我们来看看源代码-

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();
    }

}
package.com.practice;
导入java.awt.GridLayout;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入javax.swing.JButton;
导入javax.swing.JFrame;
导入javax.swing.JProgressBar;
导入javax.swing.SwingUtilities;
导入javax.swing.SwingWorker;
公开课进展示例{
私有静态JFrame;
私有静态JButton btnStart;
私有静态JButton btnStop;
私有静态JProgressBar进程;
私有静态整数值;
私有静态布尔swingWorkerHelper;
私有静态SwingWorker SwingWorker;
公共静态void main(字符串[]args){
//异步为事件调度线程(EDT)调度Swing应用程序
SwingUtilities.invokeLater(新的Runnable(){
公开募捐{
运行SwingGasynchronousApp();
}
});
}
私有静态无效runSwingAsynchronousApp(){
currValue=新整数(0);
btnStart=新的JButton(“开始”);
btnStop=新按钮(“停止”);
进度=新的JProgressBar();
进度。设置最小值(0);
进度。设定最大值(100);
进度。设置字符串绘制(真);
btnStart.addActionListener(新ActionListener(){
@凌驾
已执行的公共无效操作(操作事件evt){
if(btnStart.getText().equals(“暂停”)){
//隐式安全地中断swingWorker方法doInBackground()。
swingWorkerHelper=false;
btnStart.setText(“简历”);
}否则{
如果(btnStart.getText().equals(“开始”)| | btnStart.getText().equals(“恢复”))
btnStart.setText(“暂停”);
showProgress();
}
}
});
btnStop.addActionListener(新操作