首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Swing Timer 定時器完全指南:從 API 到數位時鐘實戰

     編輯:Java 相關知識

javax.swing.Timer 是 Swing 事件分派執行緒(EDT)安全的定時器,專為 GUI 週期性更新設計(如 JTable 刷新、JLabel 動態顯示)。本文解析構造器、核心方法,並以數位時鐘完整實作示範最佳實踐。

核心 API

// 構造器
Timer(int delay, ActionListener listener)
// delay: 毫秒間隔;listener: 接收 ActionEvent 的監聽器

// 啟動/停止
void start()
void stop()
// 重新啟動(重置計時)
void restart()
// 設定間隔
void setDelay(int delay)
// 是否運行中
boolean isRunning()

API 範例解析


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 上建構顯示
    }
}

關鍵設計點

  1. 類別實作 ActionListener,構造器傳 this,簡化監聽器管理
  2. timer.start() 後,每 500ms 在 **EDT** 執行 actionPerformed
  3. 直接操作 JLabel.setText **零執行緒風險**
  4. 500ms 間隔確保秒數跳動流暢(1000ms 會有明顯延遲感)

時間格式補充知識


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制)。

進階提示

  • 非 Swing 定時器(java.util.Timer)在背景執行緒觸發,**不可直接操作 Swing 元件**,需用 SwingUtilities.invokeLater 包裝
  • 長時間任務請用 SwingWorker,避免阻塞 EDT 導致介面凍結
  • Timer 適合**輕量、週期性**的 UI 更新(動畫、輪詢、時鐘、狀態同步)

善用 javax.swing.Timer,能以最簡潔代碼實現執行緒安全的 GUI 定時更新,是 Swing 開發者必備工具箱。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved