您的位置:首页 > 其它

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

2017-07-05 11:11 260 查看
最近在用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)));
}
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  swing