2011-05-19 32 views
1

我有一個視圖有幾個「標誌」按鈕(JToggleButton)。當用戶點擊一個標誌按鈕時,我想更新一個數組來跟蹤哪些按鈕被標記。這是非常簡單的,這裏是我做了什麼:Java:透明地處理狀態改變事件

... 
    bflag[i].addItemListener(this); //View listens to state change 
... 

void itemStateChange(ItemEvent ie) { 
    try { 
     jtb = (JToggleButton)ie.getSource(); 
     //Update mark array 
    } 
    catch (ClassCastException cce) {} 
} 

這只是正常的,但它是醜陋與try/catch語句。我更喜歡做這樣的事情:

void itemStateChange(ItemEvent ie) { 
    handleStateChange(ie.getSource()); 
} 

void handleStateChange(JToggleButton jtb) { 
    //handle state change 
} 

void handleStateChange(Object o) {} 

這是好得多,但唯一的問題是,Object方法將火,即使源是JToggleButton(因爲JToggleButton畢竟是一個Object) 。

我也考慮過使用雙派遣,但是這將需要覆蓋JToggleButton方法引發itemStateChange(),我不知道那是什麼(並且看起來不安全)。

有關如何在沒有嘗試/趕上,有條件檢查等情況下工作的任何建議?

回答

1

你將不得不明確檢查類型,我認爲。

if(ie.getSource() instanceof JToggleButton){ 
     //toggle button logic 
    }else{ 
     //something else 
    } 

或者,您可以使用匿名內部類來實現您的偵聽器,並避免必須完全檢查源。


事情是這樣的:

toggleBtn.addItemListener(new ItemListener(){ 
     public void itemStateChange(ItemEvent ie){ 
      //handle toggle button event 
     } 
}); 
+0

我認爲這是遠高於鑄鐵檢查醜陋的(或至少是同樣難看)。請詳細說明「匿名內部班級」計劃。 – 2011-05-19 13:30:53

+0

@tandu儘管instanceof運算符沒有提高代碼的美感,但最好將異常用作流控制機制。我還用一個使用匿名內部類的例子更新了答案。 – 2011-05-19 13:38:21

+0

匿名內部類需要知道視圖才能更新數組。它沒有。 – 2011-05-19 14:17:31