首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Java Swing:匿名內部類監聽器中變量未更新的排查思路

     編輯:程式設計綜合問答

問題現象

在 mouseClicked 事件中給實例變量 masage 賦值,但在其他類呼叫 getMasage() 時仍獲取到初始值 "123"。

核心原因分析

  1. 事件未觸發:父類 setButton10 的 addListener 可能未正確註冊滑鼠監聽器,導致 mouseClicked 從未執行。
  2. 線程可見性:若監聽器在事件分發線程(EDT)執行,而讀取在其他線程,需將 masage 聲明為 volatile 或使用 AtomicReference。
  3. 實例不一致:調用 getMasage() 的對象與註冊監聽器的對象不是同一個實例。

排查步驟

// 1. 在 mouseClicked 打斷點或打印日誌,確認是否進入
public void mouseClicked(MouseEvent e) {
    System.out.println("mouseClicked triggered");
    masage = information.getText();
    information.setText(null);
}

// 2. 檢查父類 addListener 實現
// 3. 確認 getMasage() 呼叫的是同一個 setButton11 實例

最佳實踐建議

  • 使用 Lambda 表達式或方法引用簡化監聽器註冊(Java 8+)。
  • 將文本框引用傳遞給監聽器,避免依賴外部可變狀態。
  • 考慮使用 PropertyChangeSupport 實現標準的 JavaBeans 屬性變更通知。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved