天天看點

Swing計時器(Timer)元件的使用一、構造方法二、常用方法三、執行個體

計時器(Timer)元件可以在指定時間間隔觸發一個或多個 ActionEvent。設定計時器的過程包括建立一個 Timer 對象,在該對象上注冊一個或多個動作偵聽器,以及使用 start() 方法啟動該計時器。具體如何過程如下:

一、構造方法

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

建立一個計時器,并初始化初始延遲和事件間延遲到延遲毫秒。如果延遲小于或等于0,則計時器将在啟動時立即觸發。如果listener不為空,它将在計時器上注冊為動作監聽器。

二、常用方法

建立 Timer 類之後,可以單獨更改初始延遲和事件間延遲,并且可以添加其他 ActionListener。如果希望計時器隻在第一次時觸發然後停止,可以對計時器調用 setRepeats(false)。Timer 類的常用方法如下圖:

Swing計時器(Timer)元件的使用一、構造方法二、常用方法三、執行個體

三、執行個體

1、建立一個進度條,一個安裝按鈕,一個顯示标簽JLabel,和一個Timer元件。

Swing計時器(Timer)元件的使用一、構造方法二、常用方法三、執行個體
Swing計時器(Timer)元件的使用一、構造方法二、常用方法三、執行個體

2、給進度條,安裝按鈕和Timer元件添加監聽,

1》點選安裝按鈕之後啟動Timer計時器。

2》Timer計時器每隔10毫秒改變一次進度條的值,每次+1

3》進度條的值改變時觸發監聽,改變JLabel标簽的值

Swing計時器(Timer)元件的使用一、構造方法二、常用方法三、執行個體

3、運作效果如下:

Swing計時器(Timer)元件的使用一、構造方法二、常用方法三、執行個體

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);
	}
}