2013-05-03 151 views
1

這對初學者來說應該是一個基本的Java程序,可以在關於ActionListener接口主題的 「Head First Java 2nd Edition」中找到。Java中的事件和監聽器

我不明白一些在這個程序中使用,如

button.addActionListener(this); 

當這個代碼執行又是怎樣的方法actionPerformed是在觸發或者運行或 你使用任何術語的所有術語?

//Program begins from now!! 

import javax.swing.*; 

import java.awt.event.*; 

public class SimpleGui1B implements ActionListener { 

    JButton button; 

    public static void main(String[] args) { 

     SimpleGui1B gui = new SimpleGui1B(); 
     gui.go(); 

    } 

    public void go(){ //start go 
     JFrame frame= new JFrame(); 
     button=new JButton("Click me"); 

     frame.getContentPane().add(button); 

     button.addActionListener(this); 

     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     frame.setSize(300,300); 
     frame.setVisible(true); 
    }//close go() 

    public void actionPerformed(ActionEvent event){ 
     button.setText("I’ve been clicked!"); 

    } 


} 

回答

1

讓我們打破這種說法好嗎:

button.addActionListener(this); 

好了,所以你引用button對象。這是我認爲的JButton類型的對象。 button對象有一個稱爲addActionListener的方法。它的作用是添加一個實現接口的對象。

發生這種情況的類是其中一個對象。正如你可以在上面看到它說:

public class SimpleGui1B implements ActionListener 

那麼,什麼程序做的,是說,當前類(this)將努力爲您的方法的參數。然後,如果你看這門課,你有一個方法actionPerformed

public void actionPerformed(ActionEvent event){ 
    button.setText("I’ve been clicked!"); 

} 

這意味着只要按鈕被點擊時,actionPerformed方法中的代碼被調用。另一種方法是說:

button.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent e) 
     { 
      // Add some code here. 
     } 

這是做同樣的事情,只是它定義括號內的類。

0

這意味着調用此代碼的類是按鈕更改的偵聽器。所以這個按鈕會在這個特定的類上調用「actionPerformed」。

0

button.addActionListener(this);告訴buttonthis想知道只要單擊該按鈕。從那以後,無論何時單擊該按鈕,它都將通過其註冊的ActionListener s的列表,並在每個方法上調用actionPerformed方法。

+0

所以它的調用就行了ActionListner接口的actionPerformed方法!謝謝您的幫助!! – Ariel 2013-05-03 15:55:10

0

什麼碼

button.addActionListener(this); 

確實是增加你的類(使用關鍵字this)是你創建的按鈕的動作監聽。 這意味着,只要發生某個操作(如點擊),按鈕就會調用您的類。這就是爲什麼你需要的方法

public void actionPerformed(ActionEvent event){ 
    button.setText("I’ve been clicked!"); 
} 

因爲它會通過按鈕

1

在將JButton類,鍵盤和鼠標事件的處理被調用,一旦按鈕檢測到點擊,它通過迭代來其作用聽衆和調用它們:

ActionEvent event = new ActionEvent(...); 
for (ActionListener listener : addedListeners) { 
    listener.actionPerformed(event); 
} 

聽衆都只是回調對象。

0

基本上,你正在通過觀察者模式,觀察者將自己註冊到subject.Now,每當這是一些事件觸發主題,主題通知不同的觀察者。這裏按鈕主題和SimpleGui1B(基本上聽衆)是observer.Now讓來到您的代碼段

button.addActionListener(this); 

在上面行,按鈕主題,這是聽衆/觀察者。一個JButton已經設計方式,當有一些事件(請在這種情況下)按鈕情況,觀察員將被通知直通方法的actionPerformed

1

讓我們通過代碼:

javax.swing.AbstractButton有一個叫addActionListener方法其中的代碼是:

public void addActionListener(ActionListener l) { 
    listenerList.add(ActionListener.class, l); 
} 

listenerListjavax.swing.JComponent定義爲:

protected EventListenerList listenerList = new EventListenerList(); 

發生事件時調用javax.swing.AbstractButton中的fireActionPerformed。代碼如下:

protected void fireActionPerformed(ActionEvent event) { 
    // Guaranteed to return a non-null array 
    Object[] listeners = listenerList.getListenerList(); 
    ActionEvent e = null; 
    // Process the listeners last to first, notifying 
    // those that are interested in this event 
    for (int i = listeners.length-2; i>=0; i-=2) { 
    if (listeners[i]==ActionListener.class) { 
     // Lazily create the event: 
     if (e == null) { 
     String actionCommand = event.getActionCommand(); 
     if(actionCommand == null) { 
      actionCommand = getActionCommand(); 
     } 
     e = new ActionEvent(AbstractButton.this, 
      ActionEvent.ACTION_PERFORMED, 
      actionCommand, 
      event.getWhen(), 
      event.getModifiers()); 
     } 
     ((ActionListener)listeners[i+1]).actionPerformed(e); 
    } 
    } 
} 

最重要的部分是,說的最後一行:

((ActionListener)listeners[i+1]).actionPerformed(e); 

這是代碼調用您actionPerformed()方法