多语言展示
当前在线:834今日阅读:145今日分享:20

取消进度条的一个示例

进度条是任务执行进度的可视化展示,如果任务取消,进度条也应该停止并归0本文分享一个使用JProgressBar来演示进度取消的示例
工具/原料
1

IntelliJ IDEA

2

JProgressBar

3

swing

4

java

方法/步骤
1

先来看一个没有取消任务功能的进度条示例代码: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);    }}

2

执行下看看效果

3

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

4

如果要取消任务,那么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);            }        });    }});

5

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

6

看看能不能重新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)”

7

看来已经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();

8

执行下看看结果成功了第二次点击“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);    }}

推荐信息