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
当SwingJButton
被触发时,它会变得混乱
现在我得到了无效的线程访问
错误,因为Display对象在单独的UI线程中运行。一次只能显示SwingJPanel
或eclipseswtShell
我正在使用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(新操作