2010-01-30 81 views
7

我有以下代碼:addActionListener的作用是什麼?

JButton button = new JButton("Clear"); 
button.addActionListener(this); 

據我瞭解我創建它是寫「清除」按鈕。然後我必須將一個動作與這個按鈕聯繫起來(如果按下按鈕會發生什麼),並且由addActionListener完成。這樣對嗎?

但我不明白的是動作被指定的地方。按下按鈕應該清除文本區域,並且據我所知,應該有一個清除文本區域的代碼。但是在給定的例子中,addActionListener()的論點中只有「this」。

當按鈕被按下時,程序如何知道它應該清除文本區域?

如果需要,完整的代碼給出here

回答

12

ActionListener是一個回調機制。無論何時添加一個控件以觸發ActionEvent,將調用public void actionPerformed(ActionEvent e)方法。

我不明白的是調用actionPerformed的地方。我發現它是在類中定義的,但是沒有方法被調用的地方。

這是由UI組件的內部機制調用的。從概念上講,你能想到看起來有點像這樣的代碼:

public class Button { 
    private final List<ActionListener> listeners = new ArrayList<ActionListener>(); 

    public void addActionListener(ActionListener l) { 
    listeners.add(l); 
    } 

    public void click() { 
    ActionEvent event = new ActionEvent(this, 0, "click"); 
    for (ActionListener l : listeners) { 
     l.actionPerformed(event); 
    } 
    } 
} 
1

您致電button.addActionListener(this),因爲this實現了接口ActionListener。點擊按鈕時,調用方法actionPerformed(ActionEvent e)(由接口定義並由您的類實現)。

+0

我不明白的是actionPerformed被調用的地方。我發現它是在類中定義的,但是沒有方法被調用的地方。 – Roman 2010-01-30 12:28:43

0

事件發生器被告知可以處理事件的對象 事件發生器有一個方法; - addActionListener方法(參照處理程序類的對象) 例如,

JButton b1=new JButton("My Button"); 
b1.addActionListener(this); // Please note listener and generator are same class 

由於事件處理程序是在包含 按鈕相同的對象,所以我們必須使用this傳遞參考。

0

基本上,UI事件處理的機制是JVM隊列事件,並且每種類型的事件都有其用戶。當事件被觸發時,如點擊按鈕,JVM將相應地將處理委託給事件的訂閱者。而這個訂戶類必須定義方法或事件處理程序來處理事件。

在你的情況下,當調用 button.addActionListener(this); 代碼實際上將此KeyEventDemo實例訂閱到類型單擊事件。然後,單擊按鈕時,觸發KeyEventDemo的actionPerformed方法。

相關問題