我有一个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](https://i.stack.imgur.com/V9hFy.gif)
我们在这里获取源代码 -
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(使用前将#替换为@)