2012-11-19 168 views
1

在java中,可以在構造對象後將引用更改爲偵聽器嗎? 例如,當這個類的對象被實例化時,我可以使用它的setter來更改偵聽器嗎? 如果我不能,我該怎麼做,我的意思是在需要時改變聽衆?何時註冊偵聽器?

public class ListenerTest extends JFrame { 

    ActionListener listener; 

    public ListenerTest() { 

     JPanel jPanel = new JPanel(); 
     JButton jButton = new JButton("Activate!"); 
     jButton.addActionListener(listener); 
     jPanel.add(jButton); 
     add(jPanel); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setTitle("Demo Drawing"); 
     setLocationRelativeTo(null); 
     pack(); 
     setVisible(true); 
    } 

    public ActionListener getListener() { 
     return listener; 
    } 

    public void setListener(ActionListener listener) { 
     this.listener = listener; 

    } 

    public static void main(String[] args) { 
     ListenerTest frame = new ListenerTest(); 
    } 

} 

回答

1

當然,你可以添加,刪除ActionListeners,但不是你試圖。如果您更改了由偵聽器變量引用的ActionListener,則這對於添加到JButton中的ActionListener沒有影響。您必須通過其addActionListener(...)removeActionListener(...)方法專門添加或刪除JButton的聽衆才能產生此效果。我認爲您需要了解的關鍵點是listener變量與它可能引用的ActionListener對象不同。所有這個變量都會引用一個ActionListener對象,如果已經給它的話。它對可能會或可能不會聽JButton的ActionListener完全沒有影響。

順便說一句,你當前的代碼似乎試圖在它被添加到該按鈕,在類的構造函數時添加null作爲JButton的ActionListener的因爲它的聽衆變空:

ActionListener listener; // variable is null here 

public ListenerTest() { 

    JPanel jPanel = new JPanel(); 
    JButton jButton = new JButton("Activate!"); 
    jButton.addActionListener(listener); // variable is still null here! 
    // .... 
} 

public void setListener(ActionListener listener) { 
    this.listener = listener; // this has no effect on the JButton 
} 

也許相反,你要做到這一點:

public void setListener(ActionListener listener) { 
    jButton.addActionListener(listener); 
} 

,或者如果你想在地方所有現有的ActionListeners添加監聽

public void setListener(ActionListener listener) { 
    ActionListener[] listeners = jButton.getActionListeners(); 
    for(ActionListener l : listeners) { 
     jButton.removeActionListener(l); // remove all current ActionListeners 
    } 
    // set new ActionListener 
    jButton.addActionListener(listener); 
} 

如果你喜歡使用AbstractActions,你也可以設置JButton的Action,有人認爲這是一個更清晰的方法。

+1

+1提及操作。我是「一些」的人之一,他強烈地感覺到使用Actions是一種遠遠更簡潔的方式來配置按鈕,菜單等。如果您想禁用按鈕,或者在按鈕和按鈕中共享相同的動作菜單,你想要一個行動。 – user949300

+0

@ user949300:謝謝,你當然是對的。我想你會和kleopatra相處的很好。 –

相關問題