Swing 所有用戶交互事件(鼠標、鍵盤、焦點)均發送至 事件分發線程 (EDT) 的 EventQueue。自動鎖定本質是 監聽事件隊列,記錄最後活動時間;後台線程定期檢查閒置時長,超過閾值觸發鎖定。
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();
}
}
MOUSE_MOTION 避免移動鼠標就重置計時器)。lastActivityTime 為 long,單次寫入原子性有保障;若用複雜對象需 volatile 或 AtomicLong。SwingUtilities.invokeLater 確保 UI 操作線程安全。javax.swing.Timer 替代手寫線程,簡化代碼且自動在 EDT 執行任務。