SwingWorker实现旋转等待提示的功能

来源:互联网 发布:淘宝的柠檬 编辑:程序博客网 时间:2024/06/09 18:53

最近在用swing写一个扫描电脑里文件的小程序时,由于扫描是一件很耗时的操作,所以每次在点击按钮后要等很久才能出结果,而中途有没有什么提示,显得很不友好,本想写一个进度条来显示,又觉得太麻烦,最后就写了一个旋转等待的dialog来进行友好提示“正在扫描中,请稍等…”,效果如下:
这里写图片描述

WaitUnit.java代码如下:

package com.scan.server.swing.unit;import java.awt.BorderLayout;/** * 旋转等待的dialog * @author ZYH * @time:2017年7月5日 */public class WaitUtil extends JDialog {    private static final long serialVersionUID = 6987303361741568128L;    private final JPanel contentPanel = new JPanel();    /**     * Create the dialog.     */    public WaitUtil() {        setBounds(0, 0, 232, 94);           getContentPane().setLayout(new BorderLayout());        contentPanel.setBorder(new EmptyBorder(5, 5, 5, 5));        getContentPane().add(contentPanel, BorderLayout.CENTER);        contentPanel.setLayout(null);        {            JLabel lblLoading = new JLabel("扫描中,请稍后...");            lblLoading.setForeground(Color.DARK_GRAY);            lblLoading.setOpaque(false);            lblLoading.setIcon(Imgs.getImage("iwait.gif"));            lblLoading.setFont(new Font("宋体", Font.PLAIN, 15));            lblLoading.setBounds(0, 0, 252, 94);            contentPanel.add(lblLoading);        }        setModalityType(ModalityType.APPLICATION_MODAL);    //置顶显示        setUndecorated(true);   //禁用或启用此窗体的装饰(true:禁用;false:启用)        setLocationRelativeTo(null);    //设置窗口相对于指定组件的位置(null表示置于屏幕的中央)    }}

然后在SwingWorker中调用代码:

package com.scan.server.test;import java.awt.BorderLayout;import java.awt.Dimension;import java.awt.EventQueue;import java.awt.Toolkit;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.SwingWorker;import javax.swing.border.EmptyBorder;import com.scan.server.swing.unit.WaitUtil;/** * 测试旋转等待提示框 * @author ZYH * @time:2017年7月5日 */public class TestWaitUnit extends JFrame {    private JPanel contentPane;    /**     * Launch the application.     */    public static void main(String[] args) {        EventQueue.invokeLater(new Runnable() {            public void run() {                try {                    TestWaitUnit frame = new TestWaitUnit();                    frame.setVisible(true);                } catch (Exception e) {                    e.printStackTrace();                }            }        });    }    /**     * Create the frame.     */    public TestWaitUnit() {        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);        setBounds(100, 100, 450, 300);        contentPane = new JPanel();        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));        contentPane.setLayout(new BorderLayout(0, 0));        setContentPane(contentPane);        int windowWidth = this.getWidth(); //获得窗口宽        int windowHeight = this.getHeight(); //获得窗口高        Toolkit kit = Toolkit.getDefaultToolkit(); //定义工具包        Dimension screenSize = kit.getScreenSize(); //获取屏幕的尺寸        int screenWidth = screenSize.width; //获取屏幕的宽        int screenHeight = screenSize.height; //获取屏幕的高        setLocation(screenWidth/2-windowWidth/2, screenHeight/2-windowHeight/2);//设置窗口居中显示        JPanel panel = new JPanel();        contentPane.add(panel, BorderLayout.NORTH);        JButton button = new JButton("\u6D4B\u8BD5\u65CB\u8F6C\u7B49\u5F85");        button.addActionListener(new ActionListener() {            @Override            public void actionPerformed(ActionEvent e) {                //旋转等待显示                final WaitUtil waitUtil = new WaitUtil();                SwingWorker<String, Void> sw = new SwingWorker<String, Void>() {                    StringBuffer sb = new StringBuffer();                    @Override                    protected String doInBackground() throws Exception {                        //-------------模拟任务开始---------------                        for(int i = 0; i < 100; i++){                            sb.append("" + i);                            System.out.println(sb.toString());                            Thread.sleep(50);                        }                        //--------------模拟任务结束--------------                        return sb.toString();                    }                    @Override                    protected void done() {                        //将耗时任务执行完得到的结果移至done来进行处理,处理完关闭旋转等待框                        try {                            String result = get();                            System.out.println(result);                        } catch (Exception e) {                            // TODO Auto-generated catch block                            e.printStackTrace();                        }                        // 关闭旋转等待框                        if(waitUtil != null) {                            waitUtil.dispose();                        }                    }                };                sw.execute();                   waitUtil.setVisible(true);  //将旋转等待框WaitUnit设置为可见            }        });        panel.add(button);    }}

接下来是旋转图片以及java代码:

package com.scan.server.img;import java.awt.Toolkit;import javax.swing.ImageIcon;public class Imgs {    public static ImageIcon getImage(String filename){        return new ImageIcon(Toolkit.getDefaultToolkit().getImage(Imgs.class.getResource(filename)));    }}

这里写图片描述