写了一个例子,仅供参考: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.JPanel; import javax.swing.JProgressBar; import javax.swing.SwingUtilities;/** * * @author bzwm * */ public class ProgressSample extends JFrame { private JProgressBar progressBar = null; private JButton startBtn = null; private JButton pauseBtn = null; private JButton stopBtn = null; private BarThread stepper = null; public ProgressSample() { super("Progress Bars"); initComponents(); layoutComponents(); } private void initComponents() { progressBar = new JProgressBar(0, 100); progressBar.setStringPainted(true); progressBar.setIndeterminate(false); startBtn = new JButton("Start"); pauseBtn = new JButton("Pause"); stopBtn = new JButton("Stop"); } private void layoutComponents() { setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); ButtonClick actionListener = new ButtonClick(); startBtn.addActionListener(actionListener); pauseBtn.addActionListener(actionListener); stopBtn.addActionListener(actionListener); JPanel topPnl = new JPanel(); topPnl.add(progressBar); JPanel btnPnl = new JPanel(new GridLayout(1, 3, 10, 10)); btnPnl.add(startBtn); btnPnl.add(pauseBtn); btnPnl.add(stopBtn); setLayout(new GridLayout(2, 1)); add(topPnl); add(btnPnl); setSize(300, 100); setVisible(true); } private class ButtonClick implements ActionListener { public void actionPerformed(ActionEvent e) { if (e.getSource() == startBtn) { startBtn.setEnabled(false); stepper = new BarThread(progressBar); stepper.start(); } else if (e.getSource() == pauseBtn) { stepper.stopWork(); stepper = null; startBtn.setEnabled(true); } else if (e.getSource() == stopBtn) { System.exit(0); } } } public static void main(String args[]) { new ProgressSample(); } }class BarThread extends Thread { private static final int DELAY = 500; private boolean run = true; private Object locker = new Object(); JProgressBar progressBar; public BarThread(JProgressBar bar) { progressBar = bar; } public void run() { synchronized (locker) { doSomething();
int minimum = progressBar.getMinimum(); int maximum = progressBar.getMaximum(); Runnable runner = new Runnable() { public void run() { int value = progressBar.getValue(); progressBar.setValue(value + 1); } }; for (int i = minimum; i < maximum; i++) { try { if (!run) { locker.wait(); } SwingUtilities.invokeAndWait(runner); // Our task for each step is to just sleep Thread.sleep(DELAY); } catch (Exception e) { e.printStackTrace(); } } } }
private void doSomething(){ //do something that you want. } public void stopWork() { run = false; } }
刚刚搞错了, 吃过饭,改了下: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.JPanel; import javax.swing.JProgressBar; import javax.swing.SwingUtilities;/** * * @author bzwm * */ public class ProgressSample extends JFrame { private JProgressBar progressBar = null; private JButton startBtn = null; private JButton pauseBtn = null; private JButton stopBtn = null; private BarThread stepper = null; public ProgressSample() { super("Progress Bars"); initComponents(); layoutComponents(); } private void initComponents() { progressBar = new JProgressBar(0, 100); progressBar.setStringPainted(true); progressBar.setIndeterminate(false); startBtn = new JButton("Start"); pauseBtn = new JButton("Pause"); stopBtn = new JButton("Stop"); } private void layoutComponents() { setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); ButtonClick actionListener = new ButtonClick(); startBtn.addActionListener(actionListener); pauseBtn.addActionListener(actionListener); stopBtn.addActionListener(actionListener); JPanel topPnl = new JPanel(); topPnl.add(progressBar); JPanel btnPnl = new JPanel(new GridLayout(1, 3, 10, 10)); btnPnl.add(startBtn); btnPnl.add(pauseBtn); btnPnl.add(stopBtn); setLayout(new GridLayout(2, 1)); add(topPnl); add(btnPnl); setSize(300, 100); setVisible(true); } private class ButtonClick implements ActionListener { public void actionPerformed(ActionEvent e) { if (e.getSource() == startBtn) { startBtn.setEnabled(false); stepper = new BarThread(progressBar); stepper.start(); } else if (e.getSource() == pauseBtn) { stepper.stopWork(); stepper = null; startBtn.setEnabled(true); } else if (e.getSource() == stopBtn) { System.exit(0); } } } public static void main(String args[]) { new ProgressSample(); } }class BarThread extends Thread { private static final int DELAY = 500; private boolean run = true; JProgressBar progressBar; public BarThread(JProgressBar bar) { progressBar = bar; } public void run() { doSomething(); int minimum = progressBar.getMinimum(); int maximum = progressBar.getMaximum(); Runnable runner = new Runnable() { public void run() { int value = progressBar.getValue(); progressBar.setValue(value + 1); } }; for (int i = minimum; i < maximum; i++) { try { if (!run) { break; } SwingUtilities.invokeAndWait(runner); // Our task for each step is to just sleep Thread.sleep(DELAY); } catch (Exception e) { e.printStackTrace(); } } } private void doSomething() { //do something that you want. } public void stopWork() { run = false; } }
简单的说有一个进程会去读一个文件,分析计算下,输出到另一个文件,并用进度条现实进度。
有一个中止的按钮,就是结束整个过程,但是按了中止后会有一个确认框,确认是否真的要中止。
就是这个时候希望在用户确认的时候,把进程给挂起。
不然用户等在那里不确认,一会就弹出处理做完的对话框了, 很奇怪。
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.SwingUtilities;/**
*
* @author bzwm
*
*/
public class ProgressSample extends JFrame {
private JProgressBar progressBar = null; private JButton startBtn = null; private JButton pauseBtn = null; private JButton stopBtn = null; private BarThread stepper = null; public ProgressSample() {
super("Progress Bars"); initComponents();
layoutComponents();
} private void initComponents() {
progressBar = new JProgressBar(0, 100);
progressBar.setStringPainted(true);
progressBar.setIndeterminate(false); startBtn = new JButton("Start");
pauseBtn = new JButton("Pause");
stopBtn = new JButton("Stop");
} private void layoutComponents() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); ButtonClick actionListener = new ButtonClick();
startBtn.addActionListener(actionListener);
pauseBtn.addActionListener(actionListener);
stopBtn.addActionListener(actionListener); JPanel topPnl = new JPanel();
topPnl.add(progressBar); JPanel btnPnl = new JPanel(new GridLayout(1, 3, 10, 10));
btnPnl.add(startBtn);
btnPnl.add(pauseBtn);
btnPnl.add(stopBtn); setLayout(new GridLayout(2, 1));
add(topPnl);
add(btnPnl); setSize(300, 100);
setVisible(true);
} private class ButtonClick implements ActionListener {
public void actionPerformed(ActionEvent e) {
if (e.getSource() == startBtn) {
startBtn.setEnabled(false);
stepper = new BarThread(progressBar);
stepper.start(); } else if (e.getSource() == pauseBtn) { stepper.stopWork();
stepper = null;
startBtn.setEnabled(true); } else if (e.getSource() == stopBtn) {
System.exit(0);
}
}
} public static void main(String args[]) {
new ProgressSample();
}
}class BarThread extends Thread {
private static final int DELAY = 500; private boolean run = true; private Object locker = new Object(); JProgressBar progressBar; public BarThread(JProgressBar bar) {
progressBar = bar;
} public void run() {
synchronized (locker) { doSomething();
int minimum = progressBar.getMinimum();
int maximum = progressBar.getMaximum();
Runnable runner = new Runnable() {
public void run() {
int value = progressBar.getValue();
progressBar.setValue(value + 1);
}
}; for (int i = minimum; i < maximum; i++) {
try {
if (!run) {
locker.wait();
}
SwingUtilities.invokeAndWait(runner);
// Our task for each step is to just sleep
Thread.sleep(DELAY);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
private void doSomething(){
//do something that you want.
} public void stopWork() {
run = false;
}
}
吃过饭,改了下: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.JPanel;
import javax.swing.JProgressBar;
import javax.swing.SwingUtilities;/**
*
* @author bzwm
*
*/
public class ProgressSample extends JFrame {
private JProgressBar progressBar = null; private JButton startBtn = null; private JButton pauseBtn = null; private JButton stopBtn = null; private BarThread stepper = null; public ProgressSample() {
super("Progress Bars"); initComponents();
layoutComponents();
} private void initComponents() {
progressBar = new JProgressBar(0, 100);
progressBar.setStringPainted(true);
progressBar.setIndeterminate(false); startBtn = new JButton("Start");
pauseBtn = new JButton("Pause");
stopBtn = new JButton("Stop");
} private void layoutComponents() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); ButtonClick actionListener = new ButtonClick();
startBtn.addActionListener(actionListener);
pauseBtn.addActionListener(actionListener);
stopBtn.addActionListener(actionListener); JPanel topPnl = new JPanel();
topPnl.add(progressBar); JPanel btnPnl = new JPanel(new GridLayout(1, 3, 10, 10));
btnPnl.add(startBtn);
btnPnl.add(pauseBtn);
btnPnl.add(stopBtn); setLayout(new GridLayout(2, 1));
add(topPnl);
add(btnPnl); setSize(300, 100);
setVisible(true);
} private class ButtonClick implements ActionListener {
public void actionPerformed(ActionEvent e) {
if (e.getSource() == startBtn) {
startBtn.setEnabled(false);
stepper = new BarThread(progressBar);
stepper.start(); } else if (e.getSource() == pauseBtn) { stepper.stopWork();
stepper = null;
startBtn.setEnabled(true); } else if (e.getSource() == stopBtn) {
System.exit(0);
}
}
} public static void main(String args[]) {
new ProgressSample();
}
}class BarThread extends Thread {
private static final int DELAY = 500; private boolean run = true; JProgressBar progressBar; public BarThread(JProgressBar bar) {
progressBar = bar;
} public void run() { doSomething(); int minimum = progressBar.getMinimum();
int maximum = progressBar.getMaximum();
Runnable runner = new Runnable() {
public void run() {
int value = progressBar.getValue();
progressBar.setValue(value + 1);
}
}; for (int i = minimum; i < maximum; i++) {
try {
if (!run) {
break;
}
SwingUtilities.invokeAndWait(runner);
// Our task for each step is to just sleep
Thread.sleep(DELAY);
} catch (Exception e) {
e.printStackTrace();
}
}
} private void doSomething() {
//do something that you want.
} public void stopWork() {
run = false;
}
}