C語言中文網 目錄
首頁 > Java Swing 閱讀:1,013

Java Swing Timer:計時器組件

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

例如,以下代碼創建并啟動一個每秒(該時間由 Timer 構造方法的第一個參數指定)觸發一次動作事件的計時器。Timer 構造方法的第二個參數指定接收計時器動作事件的監聽器。
int delay=1000;    //時間間隔,單位為毫秒
ActionListener taskPerformer=new ActionListener()
{
    public void afrfcionPerformed(ActionEvent evt)
    {
        //具體的任務
    }
};
new Timer(delay,taskPerformer).start();

創建 Timer 類時要指定一個延遲參數和一個 ActionListener。延遲參數用于設置初始延遲和事件觸發之間的延遲(以毫秒為單位)。啟動計時器后,它將在向已注冊監聽器觸發第一個 ActionEvent 之前等待初始延遲。第一個事件之后,每次超過事件間延遲時它都繼續觸發事件,直到被停止。

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

表1 Timer類的常用方法
方法名稱 說明
addActionListener(ActionListener 1) 將一個動作監聽器添加到 Timer
getDelay() 返回兩次觸發動作事件間延遲,以毫秒為單位
isCoalesce() 如果 Timer 組合多個掛起的動作事件,則返回 true
isRunning() 如果 Timer 正在運行,則返回 true
restart() 重新啟動 Timer,取消所有掛起的觸發并使它按初始延遲觸發
setCoalesce(boolean flag) 設置 Timer 是否組合多個掛起的 ActionEvent
setDelay(int delay) 設置 Timer 的事件間延遲,兩次連續的動作事件之間的毫秒數
setLogTimers(boolean flag) 啟用/禁用計時器日志
setRepeats(boolean flag) 如果 flag 為 false,則指示 Timer 只向其監聽器發送一次動作事件
start() 啟動 Timer,使它開始向其監聽器發送動作事件
stop() 停止 Timer,使它停止向其監聽器發送動作事件

例 1

編寫一個實例,模擬軟件安裝過程中顯示安裝進度信息的進度條。該實例中使用 Timer 類模擬安裝軟件的實際過程,JProgressBar 類顯示相應的進度信息,主要實現過程如下。

(1) 創建一個 JProgressBarDemo1 類并實現 ActionListener 接口和 ChangeListener 接口。
package ch18;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
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.event.ChangeEvent;
import javax.swing.event.ChangeListener;
public class JProgressBarDemo1 implements ActionListener,ChangeListener
{
    JFrame frame=null;
    JProgressBar progressbar;
    JLabel label;
    Timer timer;
    JButton b;
    public static void main(String[] agrs)
    {
        new JProgressBarDemo1();    //創建一個實例化對象
    }
}

(2) 在構造方法中對進度條和計時器進行設置。主要代碼如下:
public JProgressBarDemo1()
{
    frame=new JFrame("軟件安裝");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    Container contentPane=frame.getContentPane();
    label=new JLabel(" ",JLabel.CENTER);    //創建顯示進度信息的文本標簽
    progressbar=new JProgressBar();    //創建一個進度條
    progressbar.setOrientation(JProgressBar.HORIZONTAL);
    progressbar.setMinimum(0);
    progressbar.setMaximum(100);
    progressbar.setValue(0);
    progressbar.setStringPainted(true);
    progressbar.addChangeListener(this);    //添加事件監聽器
    //設置進度條的幾何形狀
    progressbar.setPreferredSize(new Dimension(300,20));
    progressbar.setBorderPainted(true);
    progressbar.setBackground(Color.pink);
    //添加啟動按鈕
    JPanel panel=new JPanel();
    b=new JButton("安裝");
    b.setForeground(Color.blue);
    //添加事件監聽器
    b.addActionListener(this);
    panel.add(b);
    timer=new Timer(100, this);    //創建一個計時器,計時間隔為100毫秒
    //把組件添加到frame中
    contentPane.add(panel,BorderLayout.NORTH);
    contentPane.add(progressbar,BorderLayout.CENTER);
    contentPane.add(label,BorderLayout.SOUTH);
    frame.pack();
    frame.setVisible(true);
}

(3) 實現 ActionListener 接口中的 actionPerformed() 方法,在這里控制計時器的開始,以及進度條值的變化。具體代碼如下:
//實現事件監聽器接口中的方法
public void actionPerformed(ActionEvent e)
{
    if(e.getSource()==b)
        timer.start();
    if(e.getSource()==timer)
    {
        int value=progressbar.getValue();
        if(value<100)
        {
            progressbar.setValue(++value);
        }
        else
        {
            timer.stop();
            frame.dispose();
        }
    }
}

(4) 實現 ChangeListener 接口中的 stateChange() 方法,具體代碼如下:
public void stateChanged(ChangeEvent e1)    //實現事件監聽器接口中的方法
{
    int value=progressbar.getValue();
    if(e1.getSource()==progressbar)
    {
        label.setText("目前已完成進度:"+Integer.toString(value)+" %");
        label.setForeground(Color.blue);
    }
}

(5) 運行程序,默認情況下進度條是 0%,如圖 1 所示。

初始效果
圖1 初始效果
單擊“安裝”按鈕后進度會一直發生變化,如圖 2 所示。

進度變化效果
圖2 進度變化效果

精美而實用的網站,提供C語言、C++、STL、Linux、Shell、Java、Go語言等教程,以及socket、GCC、vi、Swing、設計模式、JSP等專題。

Copyright ?2011-2018 biancheng.net, 陜ICP備15000209號

底部Logo