Swing计时器(Timer)组件的使用

计时器(Timer)组件可以在指定时间间隔触发一个或多个 ActionEvent。设置计时器的过程包括创建一个 Timer 对象,在该对象上注册一个或多个动作侦听器,以及使用 start() 方法启动该计时器。具体如何过程如下:

一、构造方法

Timer timer = new Timer(int delay, ActionListener listener)

创建一个计时器,并初始化初始延迟和事件间延迟到延迟毫秒。如果延迟小于或等于0,则计时器将在启动时立即触发。如果listener不为空,它将在计时器上注册为动作监听器。

二、常用方法

创建 Timer 类之后,可以单独更改初始延迟和事件间延迟,并且可以添加其他 ActionListener。如果希望计时器只在第一次时触发然后停止,可以对计时器调用 setRepeats(false)。Timer 类的常用方法如下图:
Swing计时器(Timer)组件的使用_第1张图片

三、实例

1、创建一个进度条,一个安装按钮,一个显示标签JLabel,和一个Timer组件。
Swing计时器(Timer)组件的使用_第2张图片
Swing计时器(Timer)组件的使用_第3张图片
2、给进度条,安装按钮和Timer组件添加监听,

1》点击安装按钮之后启动Timer计时器。

2》Timer计时器每隔10毫秒改变一次进度条的值,每次+1

3》进度条的值改变时触发监听,改变JLabel标签的值
Swing计时器(Timer)组件的使用_第4张图片
3、运行效果如下:
Swing计时器(Timer)组件的使用_第5张图片
4、代码如下:

package swing;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.GridLayout;
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.JLabel;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.Timer;
import javax.swing.border.EmptyBorder;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

/**
 *   计时器
 */
public class Demo24_Timer implements ActionListener,ChangeListener{
	JFrame frame=null;
    JProgressBar progressbar;
    JLabel label;
    Timer timer;
    JButton b;
	public static void main(String[] args) {
		new Demo24_Timer();
	}
	public Demo24_Timer() {
		frame=new JFrame("软件安装");
	    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	    Container contentPane=frame.getContentPane();
	    label=new JLabel(" ",JLabel.CENTER);    //创建显示进度信息的文本标签
	    label.setPreferredSize(new Dimension(300,50));
	    label.setFont(new Font("宋体", 1, 25));
	    progressbar=new JProgressBar();    //创建一个进度条
	    progressbar.setOrientation(JProgressBar.HORIZONTAL);
	    progressbar.setMinimum(0);
	    progressbar.setMaximum(100);
	    progressbar.setValue(0);
	    progressbar.setFont(new Font("宋体", 1, 20));
	    progressbar.setStringPainted(true);
	    progressbar.addChangeListener(this);    //添加事件监听器
	    //设置进度条的几何形状
	    progressbar.setPreferredSize(new Dimension(700,50));
	    progressbar.setBorderPainted(true);
	    progressbar.setBackground(Color.pink);
	    JPanel centernPanel = new JPanel();
	    centernPanel.setBorder(new EmptyBorder(200,50,50,50));
	    centernPanel.add(progressbar);
	    //添加启动按钮
	    JPanel panel=new JPanel();
	    b=new JButton("安装");
	    b.setForeground(Color.blue);
	    //添加事件监听器
	    b.addActionListener(this);
	    panel.add(b);
	    timer=new Timer(10, this);    //创建一个计时器,计时间隔为10毫秒
	    //把组件添加到frame中
	    contentPane.add(panel,BorderLayout.NORTH);
	    contentPane.add(centernPanel,BorderLayout.CENTER);
	    contentPane.add(label,BorderLayout.SOUTH);
	    SwingUtils.setCenter(frame);//设置窗体大小600*800并居中
	    frame.setVisible(true);
	}
	
	//进度条值改变的监听
	@Override
	public void stateChanged(ChangeEvent e) {
		int value=progressbar.getValue();
	    if(e.getSource()==progressbar) {
	        label.setText("目前已完成进度:"+Integer.toString(value)+" %");
	        label.setForeground(Color.blue);
	    }
	}

	@Override
	public void actionPerformed(ActionEvent e) {
		if(e.getSource()==b)//安装按钮监听:启动Timer计时器
	        timer.start();
	    if(e.getSource()==timer){//Timer计时器监听:每隔10毫秒,让进度条的值+1
	        int value=progressbar.getValue();
	        if(value<100){
	            progressbar.setValue(++value);
	        }
	        else{
	            timer.stop();
	            frame.dispose();
	        }
	    }
	}
}
package swing;

import java.awt.Toolkit;

import javax.swing.JFrame;

public class SwingUtils {
	public static void setCenter(JFrame jf) {
		int screenWidth=Toolkit.getDefaultToolkit().getScreenSize().width;
		int screenHeight=Toolkit.getDefaultToolkit().getScreenSize().height; 
		int jframeWidth = 800;
		int jframeHeight = 600;
		jf.setBounds((screenWidth/2)-(jframeWidth/2), (screenHeight/2)-(jframeHeight/2), 
        		jframeWidth, jframeHeight);
	}
}

你可能感兴趣的:(#,Swing)