使用Timer为界面执行异步任务

时间:2023-01-28 00:13:07

-------------------siwuxie095

   

   

   

   

   

   

工程名:TestSwingTimer

包名:com.siwuxie095.timer

类名:TestTimer.java

   

   

工程结构目录如下:

   

使用Timer为界面执行异步任务

   

   

   

   

代码:

   

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%,循环

   

使用Timer为界面执行异步任务

   

   

   

运行程序:

   

使用Timer为界面执行异步任务

   

   

   

   

   

   

【made by siwuxie095】