2012-02-10 64 views
0

在我的程序中,我有幾個swing組件,我碰到的一個問題是如果觸發了一個動作事件,我的ActionPerformed方法會觸發兩次。我最終發現這是由於我的ActionBistener有兩次意外添加了一個ActionListener,所以我確認了這兩個確認。爲什麼一個組件的ActionListener會影響另一個組件?

然而,有一兩件事,我不明白,我是相當新的Java的所以請原諒我問的東西,似乎是顯而易見的:

我已經給我的所有組件動作偵聽器這樣的:

confirmBtn.addActionListener(this); 

,然後參考他們在我的ActionPerformed(ActionEvent e)方法是這樣的:

if(e.getSource() == confirmBtn) 
    Execute code.... 

我的問題是,爲什麼那麼,意外地給剛one組件是一個額外的ActionListener,它是否影響了在ActionPerformed方法中被調用的所有其他組件,通過使它們也被觸發兩次?這與我給每個組件ActionListeners的方式有關嗎?

+0

另外,如果問題標題的措詞不正確,我很抱歉,因爲難以嘗試和解釋 – Jake 2012-02-10 23:02:04

+0

所以,您的意思是,意外地將相同的操作偵聽器添加到相同的組件兩次(導致它被調用兩次),所有你添加到其他組件的其他動作偵聽器也會被觸發兩次? – 2012-02-10 23:08:25

+0

是的我的問題是爲什麼會發生這種情況,我不明白它背後的邏輯。 – Jake 2012-02-10 23:09:23

回答

0

您是否註冊過所有組件的ActionListener?在發言

confirmBtn.addActionListener(this); 

this讓我這麼認爲。我不建議這樣做,因爲你必須在actionPerformed()方法中實現更復雜的邏輯,並且這個事情可能會很快搞亂。

我會做的是爲每個組件創建單獨的ActionListener,以便它們彼此獨立工作。這可以使用inner, local or anonymous classes輕鬆完成。作爲例子,考慮你有兩個按鈕,一個用於確認,一個用於取消。我提出的結構將是:

public class MyFrame extends JFrame { 
    ... 
    public void mySetup() { 
     ... 
     confirmBtn.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       confirmed(e); // delegate to outer class for cleaner code 
      } 
     }); 

     canceledBtn.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       cancelled(e); // delegate to outer class for cleaner code 
      } 
     }); 
     ... 
    } 
    ... 
    private void confirmed(ActionEvent e) { 
     // Your real confirmBtn action code 
    } 

    private void cancelled(ActionEvent e) { 
     // Your real cancelBtn action code 
    } 
    ... 
} 

這樣會比較冗長,而且是每一個組件都有自己的ActionListener無意相互作用的可能性要小得多。

+0

感謝您的回答,因此您不必爲每個組件提供一個帶有大量if else語句的ActionPerformed()方法,而是爲每個組件事件提供自己的方法。我是否正確地說,我所採取的方式是糟糕的編碼習慣和不良習慣?謝謝:) – Jake 2012-02-11 23:06:15

+0

@Jake個人而言,我肯定會喜歡幾個獨立的小方法,而不是每個人都會說的一個大方法 – gpeche 2012-02-11 23:57:40

相關問題