2013-02-21 22 views
1

我已經在simpleGUI的java中編寫了一個小代碼。java中的事件處理和java中的actionPerformed方法的執行

package guidemo1; 

import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.JButton; 
import javax.swing.JFrame; 

public class GuiDemo1 implements ActionListener{ 
JButton button; 
    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String[] args) { 
     GuiDemo1 gui=new GuiDemo1(); 
     gui.go(); 
    } 

    public void go() 
    { 
     JFrame frame=new JFrame(); 
     button=new JButton(); 
     frame.getContentPane().add(button); 
     button.addActionListener(this); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setSize(300, 200); 
     frame.setVisible(true); 

    } 
    @Override 
    public void actionPerformed(ActionEvent e) { 
     //throw new UnsupportedOperationException("Not supported yet."); 
     button.setText("I've been clicked"); 
    } 
} 

我是JAVA新手。我幾乎沒有問題涉及到這個程序。

有人可以解釋如何執行actionPerformed方法沒有任何調用?

這裏我已經在go()方法本地定義了框架對象,並且我們在actionPerformed中使用了按鈕,這是另一種方法。這是可能的嗎?按鈕是否嵌入到框架中?

謝謝..

+0

作爲ActionListener的實現,actionPerformed()被覆蓋,所以任何操作都會在沒有任何調用的情況下進入actionPerformed()... – 2013-02-21 10:44:11

回答

1

有人可以解釋如何執行actionPerformed方法與任何調用?

GUI框架Swing在後臺運行動作處理代碼。無論何時按下按鈕或用戶以其他方式與GUI進行交互,Swing都將通過多個Listener接口之一來通知您的應用程序。爲了接收這些事件,你的類需要實現合適的Listener接口,並註冊爲每個組件它感興趣。

你的類實現了ActionListener接口,並呼籲addActionListener將其自身註冊到按鈕上的監聽。點擊按鈕時,Swing將通過調用actionPerformed方法嘗試通知所有註冊的ActionListener。這就是「魔法」發生的方式。

在這裏,我已在本地定義的幀對象到go()方法,我們在的actionPerformed這是另一種method.How使用按鈕可能呢?是不是該按鈕被嵌入在框架上?

add的按鈕框架的內容窗格 - 這使按鈕框內在佈局,而不是在你的代碼。由於您通過將JButton button;置於任何方法之外來聲明button作爲實例變量,因此仍可從該類中的任何(非static)方法訪問它。

3

你的類實現ActionListener,所以你必須定義actionPerformed方法。您還可以撥打button.addActionListener(this),將當前對象註冊爲按鈕按下的監聽器。

當按鈕按下事件被觸發時,所有的監聽器都會被通知,包括你已經註冊爲監聽器的對象。

+2

不確定這可能是答案的一部分,但OP還應該查看「Observer模式」。 – 2013-02-21 10:47:22

+0

(nb - 按鈕可以有多個監聽器,我發現「處理器」的概念有點錯誤 - 恕我直言) – MadProgrammer 2013-02-21 10:49:25

+0

@MadProgrammer用「監聽器」代替「處理器」。 – 2013-02-21 11:04:02

3

歡迎來到事件驅動的環境。

在這種環境下,您需要註冊「偵聽器」,等待事情發生,然後通過定義良好的接口結構回報給您。

基本上,發生了什麼事情,您是否註冊了自己作爲可能發生在按鈕上的操作事件的感興趣方。您已通過實施ActionListener界面完成此操作。這允許該按鈕在執行操作時在將來的某個時間回撥到您的actionPerformed方法。

這通常被稱爲觀察者模式。

您可能會發現Writing Event Listeners一個有用的閱讀

1

至於第二個問題,Java是一個參考語言。只要有人持有對它們的引用,所有對象都駐留在堆上並且處於活動狀態。

在Swing中,情況稍微複雜一點。 Swing庫擁有對所有GUI元素(比如JFrame和JButton)的引用,所以這就是爲什麼它們不會被刪除,即使你不再持有引用。

至於第一個問題,看看主線程做了什麼 - 它創建一個新的對象GuiDemo1,調用go()方法創建一個JFrame,並顯示該框架。有一個特殊的Swing線程,Event Dispatch Thread,它在後臺等待GUI中的事件發生。顯示框架開始EDT,然後呈現框架並休眠。主線程完成了主要方法中的所有工作,然後是DIES。

現在,您已顯示一個JFrame並且正在啓動事件調度線程。 EDT現在正在等待與JFrame的用戶交互(事件) - Swing是事件驅動的。每次與框架交互時,Swing都會爲它創建事件並喚醒EDT來處理事件。例如,如果你點擊一個按鈕,EDT醒來,動畫按鈕「點擊」並調用所有動作監聽器。那當你的方法actionPerformed被調用。

+0

Swing庫持有的意義上?是否有任何類擁有這些引用? – user12458 2014-02-04 12:40:26

+0

我認爲edt是一個用戶線程而不是後臺線程。 – user12458 2014-02-04 13:17:01

0
  • 實現ActionListener

  • 添加ActionListener添加到您的接口

  • 添加actionPerformed方法到類

  • 設置一個計時器,並在你的類啓動

這將做到