2012-05-12 58 views
2

在Swing項目時,我使用了一個JFrame,把它分成三個部分:菜單窗格,一個情景窗格狀態窗格添加監聽到的JFrame和所有子

狀態窗格在執行操作時向用戶顯示其操作是否成功,以及用戶可能想知道的其他信息。例如,如果用戶單擊上下文菜單中的刪除按鈕,狀態面板將指示操作是否成功完成。

狀態面板的問題在於它需要稍後更新其狀態。例如,如果用戶單擊另一個按鈕或瀏覽上下文窗格中的其他頁面,則狀態窗格不應該仍顯示上次刪除操作的結果。

這有兩種解決方法,我能想到的:

  1. 明確幾秒鐘後的狀態。
  2. 向所有組件(JPanelsJTextFields,...)添加鼠標或鍵盤動作偵聽器,以便在來自鼠標或鍵盤的活動時它們調用狀態面板來清除狀態。

儘管實施第一個選項相對簡單,但還不夠。我想我需要兩者的結合。然而,問題在於,如果我想將這些動作偵聽器添加到所有組件,它將是一個非常骯髒的方法。也許我可以將它添加到主框架。我做了(代碼在下面給出),但是如果只在鼠標在框架自己的面板上移動時才起作用(例如,不在上下文窗格上)

您有什麼建議嗎?

JFrame.this.addMouseMotionListener(new MouseMotionListener() { 

     @Override 
     public void mouseDragged(MouseEvent me) { 
     } 

     @Override 
     public void mouseMoved(MouseEvent me) { 
      Config.statusPanel.clearStatus(); 
     } 
    }); 

回答

2

不,使用MouseListener爲此有點瘋狂,而你自己卻說這是一個骯髒的解決方案。相反,我認爲使用PropertyChangeListener來監聽類的狀態,最有可能是Model類,而不是視圖類都更好。

例如,用戶按下JButton(視圖類中的一個組件),控制類對此按鈕進行反應並告訴模型更改其狀態。狀態窗格的PropertyChangeListener將響應模型的狀態更改並更新其自己的視圖。這是解決這個問題的最清潔的OOP方法。

爲了使其運行良好,您的程序應該基於模型 - 視圖 - 控制器模式的變體之一,但是無論如何它應該這樣做。

+1

或者,您的模型可以將更改推送給某個狀態管理器,而不是偵聽模型上的更改,然後更新UI中的狀態。但基本原則仍然相同 – Robin

+1

@Robin:只要模型不必擔心知道任何視圖的任何內容,就可以拉或推數據。 –