进度条是任务执行进度的可视化展示,如果任务取消,进度条也应该停止并归0
本文分享一个使用JProgressBar来演示进度取消的示例
前期准备工作(包括相关工具或所使用的原料等)IntelliJ IDEAJProgressBarswingjava 详细的操作方法或具体步骤
先来看一个没有取消任务功能的进度条示例
代码:
package chapter4;
import org.jvnet.substance.skin.CremeCoffeeSkin;
import org.jvnet.substance.skin.SubstanceAutumnLookAndFeel;
import org.jvnet.substance.skin.SubstanceSaharaLookAndFeel;
import javax.swing.*;
import javax.swing.plaf.metal.MetalProgressBarUI;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.concurrent.TimeUnit;
/**
* Created by MyWorld on 2016/3/24.
*/
public class SwingJProgressBarDemo {
public static void main(String[] args) throws UnsupportedLookAndFeelException {
UIManager.setLookAndFeel(new SubstanceAutumnLookAndFeel());
SubstanceSaharaLookAndFeel.setSkin(new CremeCoffeeSkin());
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new SwingJProgressBarDemo().initGUI();
}
});
} private void initGUI() {
final JFrame frame=new JFrame("JProgressBarDemo");
frame.setSize(400, 200);
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new FlowLayout());
final JProgressBar progressBar=new JProgressBar();
progressBar.setOrientation(JProgressBar.HORIZONTAL);
progressBar.setSize(200, 100);
progressBar.setMinimum(0);
progressBar.setMaximum(100);
progressBar.setBorderPainted(true);
progressBar.setUI(new MetalProgressBarUI());
progressBar.setBackground(Color.green);
progressBar.setForeground(Color.BLUE);
progressBar.setStringPainted(true);
frame.add(progressBar);
JButton btn=new JButton("Start ProgressBar");
ActionListener listener=new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
new Thread((new Runnable() {
@Override
public void run() {
for (int i=0; i <=10; i++) {
final int finalI=i;
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
progressBar.setValue(finalI * 10);
}
}); try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
}
}
})).start(); }
};
btn.addActionListener(listener); frame.add(btn);
frame.setVisible(true);
}
}



执行下看看效果

要取消进度条,需要在GUI界面上新增一个JButton
Code:
JButton btnCancel=new JButton("Cancel the task");
frame.add(btn);

如果要取消任务,那么Start按钮和Cancel一定要能进行通信,一定要有一个共享参数
代码更改如下:
Runnable runnable=new Runnable() {
@Override
public void run() {
try {
for (int i=0; i <=10; i++) {
final int finalI=i;
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
progressBar.setValue(finalI * 10);
}
});
TimeUnit.SECONDS.sleep(1);
}
} catch (InterruptedException e1) {
e1.printStackTrace();
}
}
};
final Thread thread=new Thread(runnable);
ActionListener listener=new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
thread.start();
}
};btnStart.addActionListener(listener);
frame.add(btnStart);
JButton btnCancel=new JButton("Cancel the task");
btnCancel.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
thread.interrupt();
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
progressBar.setValue(0);
}
});
}
});

执行上面的代码,看看效果
进度条可以取消
OK

看看能不能重新Star进度条
再点击“Start ProgressBar”按钮
进度条没有再运行,并且报错了
“
TERMINATED
Exception in thread "AWT-EventQueue-0" java.lang.IllegalThreadStateException
at java.lang.Thread.start(Thread.java:638)
at chapter4.SwingJProgressBarDemo$3.actionPerformed(SwingJProgressBarDemo.java:72)
”

看来已经TERMINATED的Thread是不能再start了,那么要在btnStart按钮的监听事件中new Thread
Code:
public class SwingJProgressBarDemo {
private static Thread thread=null;
.
.
.
ActionListener listener=new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
thread=new Thread(runnable);
thread.start();


执行下看看结果
成功了
第二次点击“Start ProgressBar”按钮,进度条又可以正常工作了
O了
把最后的代码粘一份:
package chapter4;
import org.jvnet.substance.skin.CremeCoffeeSkin;
import org.jvnet.substance.skin.SubstanceAutumnLookAndFeel;
import org.jvnet.substance.skin.SubstanceSaharaLookAndFeel;
import javax.swing.*;
import javax.swing.plaf.metal.MetalProgressBarUI;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.concurrent.TimeUnit;
/**
* Created by MyWorld on 2016/3/24.
*/
public class SwingJProgressBarDemo {
private static Thread thread=null;
public static void main(String[] args) throws UnsupportedLookAndFeelException {
UIManager.setLookAndFeel(new SubstanceAutumnLookAndFeel());
SubstanceSaharaLookAndFeel.setSkin(new CremeCoffeeSkin());
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new SwingJProgressBarDemo().initGUI();
}
});
} private void initGUI() {
final JFrame frame=new JFrame("JProgressBarDemo");
frame.setSize(400, 200);
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new FlowLayout());
final JProgressBar progressBar=new JProgressBar();
progressBar.setOrientation(JProgressBar.HORIZONTAL);
progressBar.setSize(200, 100);
progressBar.setMinimum(0);
progressBar.setMaximum(100);
progressBar.setBorderPainted(true);
progressBar.setUI(new MetalProgressBarUI());
progressBar.setBackground(Color.BLUE);
progressBar.setForeground(Color.GREEN);
progressBar.setStringPainted(true);
frame.add(progressBar);
JButton btnStart=new JButton("Start ProgressBar");
final Runnable runnable=new Runnable() {
@Override
public void run() {
try {
for (int i=0; i <=10; i++) {
final int finalI=i;
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
progressBar.setValue(finalI * 10);
}
});
TimeUnit.SECONDS.sleep(1);
}
} catch (InterruptedException e1) {
e1.printStackTrace();
}
}
};
ActionListener listener=new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
thread=new Thread(runnable);
thread.start();
}
}; btnStart.addActionListener(listener);
frame.add(btnStart); JButton btnCancel=new JButton("Cancel the task");
btnCancel.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (thread==null || !thread.isAlive()) {
return;
}
thread.interrupt();
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
progressBar.setValue(0);
}
});
}
});
frame.add(btnCancel);
frame.setVisible(true);
}
}

- 评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)
-
