javax.swing.Timer 是 Swing 事件分派執行緒(EDT)安全的定時器,專為 GUI 週期性更新設計(如 JTable 刷新、JLabel 動態顯示)。本文解析構造器、核心方法,並以數位時鐘完整實作示範最佳實踐。
// 構造器
Timer(int delay, ActionListener listener)
// delay: 毫秒間隔;listener: 接收 ActionEvent 的監聽器
// 啟動/停止
void start()
void stop()
// 重新啟動(重置計時)
void restart()
// 設定間隔
void setDelay(int delay)
// 是否運行中
boolean isRunning()
int delay = 1000; // 1 秒
ActionListener task = new ActionListener() {
public void actionPerformed(ActionEvent e) {
// 執行週期性任務
}
};
new Timer(delay, task).start();
每秒在 EDT 上觸發 actionPerformed,**保證執行緒安全**,可直接操作 Swing 元件。
import java.awt.event.*;
import java.text.*;
import java.util.Date;
import javax.swing.*;
public class TimerTest extends JFrame implements ActionListener {
private JLabel timeLabel = new JLabel();
private Timer timer;
public TimerTest() {
setTitle("Timer 測試");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(180, 80);
add(timeLabel);
// 500ms 間隔,this 為 ActionListener
timer = new Timer(500, this);
timer.start();
setVisible(true);
}
@Override
public void actionPerformed(ActionEvent e) {
DateFormat fmt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
timeLabel.setText(fmt.format(new Date()));
}
public static void main(String[] args) {
new TimerTest(); // EDT 上建構顯示
}
}
this,簡化監聽器管理timer.start() 後,每 500ms 在 **EDT** 執行 actionPerformedJLabel.setText **零執行緒風險**
DateFormat fmt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
// yyyy: 年 MM: 月 dd: 日
// HH: 24制時 mm: 分 ss: 秒
// hh: 12制時 a: AM/PM 標記
易混淆點:MM(月)vs mm(分)、HH(24制)vs hh(12制)。
java.util.Timer)在背景執行緒觸發,**不可直接操作 Swing 元件**,需用 SwingUtilities.invokeLater 包裝SwingWorker,避免阻塞 EDT 導致介面凍結善用 javax.swing.Timer,能以最簡潔代碼實現執行緒安全的 GUI 定時更新,是 Swing 開發者必備工具箱。