IntelliJ IDEA
JProgressBar
swing
java
先来看一个没有取消任务功能的进度条示例代码: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界面上新增一个JButtonCode: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”按钮进度条没有再运行,并且报错了“TERMINATEDException 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 ThreadCode: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); }}