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

Swing 系統界面自動鎖定實現原理:AWT 事件隊列監聽與定時檢測機制

     編輯:Java 相關知識

核心原理

Swing 所有用戶交互事件(鼠標、鍵盤、焦點)均發送至 事件分發線程 (EDT) 的 EventQueue。自動鎖定本質是 監聽事件隊列,記錄最後活動時間;後台線程定期檢查閒置時長,超過閾值觸發鎖定。

關鍵 API

  • Toolkit.getDefaultToolkit().addAWTEventListener(listener, eventMask):註冊全局 AWT 事件監聽器。
  • 事件掩碼:AWTEvent.MOUSE_EVENT_MASK | KEY_EVENT_MASK | FOCUS_EVENT_MASK 等。
  • Timer 或獨立 Thread 實現定時檢測。

完整示例代碼

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class AutoLockDemo {
    private static long lastActivityTime = System.currentTimeMillis();
    private static final int LOCK_TIMEOUT_MS = 5 * 60 * 1000; // 5 分鐘

    public static void main(String[] args) {
        JFrame frame = new JFrame("自動鎖定演示");
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.setSize(500, 500);
        frame.setVisible(true);

        // 1. 註冊全局事件監聽器
        AWTEventListener listener = new AWTEventListener() {
            @Override
            public void eventDispatched(AWTEvent event) {
                lastActivityTime = System.currentTimeMillis(); // 更新最後活動時間
                // System.out.println("Event: " + event.getClass().getSimpleName());
            }
        };
        Toolkit.getDefaultToolkit().addAWTEventListener(listener,
                AWTEvent.MOUSE_EVENT_MASK | AWTEvent.KEY_EVENT_MASK | AWTEvent.FOCUS_EVENT_MASK);

        // 2. 後台定時檢測線程
        new Thread(() -> {
            while (true) {
                try { Thread.sleep(10_000); } // 每 10 秒檢查一次
                catch (InterruptedException ignored) { break; }
                long idle = System.currentTimeMillis() - lastActivityTime;
                if (idle >= LOCK_TIMEOUT_MS) {
                    SwingUtilities.invokeLater(() -> {
                        // 實際專案中:顯示鎖定對話框、要求密碼、禁用操作
                        JOptionPane.showMessageDialog(frame, "系統已自動鎖定!閒置 " + (idle/1000) + " 秒");
                        // 執行鎖定邏輯...
                    });
                    break; // 演示結束
                }
            }
        }, "AutoLock-Checker").start();
    }
}

實現要點

  1. 事件掩碼選擇:根據業務需求決定監聽哪些事件(如排除 MOUSE_MOTION 避免移動鼠標就重置計時器)。
  2. 線程安全:lastActivityTime 為 long,單次寫入原子性有保障;若用複雜對象需 volatile 或 AtomicLong。
  3. 鎖定動作在 EDT 執行:使用 SwingUtilities.invokeLater 確保 UI 操作線程安全。
  4. 類比 Session 管理:原理同 Web 容器 Session 超時機制(最後訪問時間 + 定時掃描清理)。

擴展建議

  • 使用 javax.swing.Timer 替代手寫線程,簡化代碼且自動在 EDT 執行任務。
  • 整合安全框架(JAAS、Spring Security)實現真實認證解鎖流程。
  • 提供「防鎖定」白名單機制(如播放視頻、下載期間不鎖定)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved