計時器(Timer)元件可以在指定時間間隔觸發一個或多個 ActionEvent。設定計時器的過程包括建立一個 Timer 對象,在該對象上注冊一個或多個動作偵聽器,以及使用 start() 方法啟動該計時器。具體如何過程如下:
一、構造方法
Timer timer = new Timer(int delay, ActionListener listener)
建立一個計時器,并初始化初始延遲和事件間延遲到延遲毫秒。如果延遲小于或等于0,則計時器将在啟動時立即觸發。如果listener不為空,它将在計時器上注冊為動作監聽器。
二、常用方法
建立 Timer 類之後,可以單獨更改初始延遲和事件間延遲,并且可以添加其他 ActionListener。如果希望計時器隻在第一次時觸發然後停止,可以對計時器調用 setRepeats(false)。Timer 類的常用方法如下圖:
三、執行個體
1、建立一個進度條,一個安裝按鈕,一個顯示标簽JLabel,和一個Timer元件。
2、給進度條,安裝按鈕和Timer元件添加監聽,
1》點選安裝按鈕之後啟動Timer計時器。
2》Timer計時器每隔10毫秒改變一次進度條的值,每次+1
3》進度條的值改變時觸發監聽,改變JLabel标簽的值
3、運作效果如下:
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);
}
}