使用Timer为界面执行异步任务
-------------------siwuxie095
工程名:TestSwingTimer
包名:com.siwuxie095.timer
类名:TestTimer.java
工程结构目录如下:
代码:
package com.siwuxie095.timer;
import java.awt.BorderLayout; import java.awt.EventQueue;
import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.border.EmptyBorder;
import com.sun.java.swing.plaf.windows.WindowsLookAndFeel;
import javax.swing.JProgressBar; import javax.swing.Timer; import javax.swing.UIManager; import javax.swing.UnsupportedLookAndFeelException; import javax.swing.JButton;
import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent;
public class TestTimer extends JFrame {
private JPanel contentPane;
//定义 value,初始值为 0 int value=0;
/** * Launch the application. */ public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { public void run() { try { TestTimer frame = new TestTimer(); frame.setVisible(true); } catch (Exception e) { e.printStackTrace(); } } }); }
/** * Create the frame. */ public TestTimer() {
try { UIManager.setLookAndFeel(new WindowsLookAndFeel()); } catch (UnsupportedLookAndFeelException e1) { e1.printStackTrace(); }
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);
JProgressBar progressBar = new JProgressBar(); contentPane.add(progressBar, BorderLayout.NORTH);
JButton btnRun = new JButton("Run"); btnRun.setFocusable(false);
/** * 为按钮 Run 添加 mouseClicked 事件 * 鼠标单击按钮Run后,进度条每隔 1 秒增加 10% * 10 秒钟后,增加到 100% (注:1000毫秒=1秒) */ btnRun.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { /** * 创建一个 Timer,注意:是 javax.swing 包中的 Timer 类 * 构造方法需要传入两个参数: * 第一个 delay 延时,以毫秒计,且 timer 所触发的动作需要经过延时才会触发 * 第二个 listener 监听器,传入匿名对象 new ActionListener() */ Timer timer=new Timer(1000, new ActionListener() {
/** * 当前 timer 所对应的操作都是在 actionPerformed() 中执行 * * 当前 timer 的 actionPerformed() 方法一旦被触发,将自动被派发给UI线程, * 放到UI线程的执行队列中去执行,所以这里面的操作都可以针对当前的UI元素来 * 进行属性的设定,所有操作都是UI线程安全的 */
@Override public void actionPerformed(ActionEvent e) { value+=10; progressBar.setValue(value); //进度条读满后,重置为 0 if (value==100) { value=0; } } });
//将该timer设定为循环执行 timer.setRepeats(true); //开启timer timer.start();
} }); contentPane.add(btnRun, BorderLayout.SOUTH); }
} |
将窗体 JFrame 的 LookAndFeel 设定为 Windows
在根面板 contentPane 的上方添加一个 JProgressBar,
下方添加一个 JButton
将 JButton 的文本(text)改为 Run,并 Rename 为 btnRun,
将 focusable 属性设为 false
为 JButton 添加 mouseClicked 事件,鼠标单击 Run 按钮后,
进度条每隔 1 秒增加 10%,10 秒钟后,增加到 100%,循环
运行程序:
【made by siwuxie095】
posted on 2017-04-06 16:30 siwuxie095 阅读(854) 评论(0) 编辑 收藏 举报