2016-07-27 70 views
0

任何一個可以讓我明白這個邏輯的流程,當按下按鈕B1那麼一些動作發生(某些語句執行),但爲什麼我們已經給出了語法像下面,創建ActionEvent對象ae以及它是如何工作的? 如果我不使用內部類,那麼我是否有任何其他表示?ActionEvent如何工作以及如何創建其對象以執行按下按鈕時執行的任務?

JButton b1=new JButton(); 
b1.addActionListener((ActionEvent ae) -> { 
    //Statements; 
}); 
+0

你是什麼意思'我有這方面的任何其他表示?'? – user3437460

+0

您需要在Web –

回答

0

所有的ActionListeners實現功能:

public void actionPerformed(ActionEvent e) { 
    ...//code that reacts to the action... 
} 

此代碼創建它實現的ActionListener,並覆蓋到任何你想要的actionPerformed功能的新的匿名類。具有這種功能的新對象添加到foo內部的ActionListeners的名單:

foo.addActionListener(new ActionListener() { 
    @Override public void actionPerformed(ActionEvent e) { 
     ...//code that reacts to the action... 
    } 
}); 

一種速記是使用lambda表達式,爲的ActionListener只有一個功能覆蓋,因此編譯器知道哪一個你平均(更多信息請參見上lambda表達式文檔):

foo.addActionListener( 
    (e) -> { 
     ...\code that reacts to the action... 
    } 
); 

發生操作時,foo將其工作的方式,通過了ActionListener對象已經上市,並調用的actionPerformed()上的每一個。每個對象的函數版本的代碼依次運行。

順便說一句這是很好的做法不是太做太多工作的actionPerformed(),因爲它是在Swing線程中執行,在這裏性能下降將意味着不響應的用戶界面。如果您需要針對某個操作運行耗時的操作,請考慮在此函數內啓動一個新線程,或者僅設置一個標記以由現有線程檢測到。

+0

非常漂亮解釋關於Lambda表達式和匿名類閱讀,得到了你的觀點,感謝這樣的字眼。 。 。 :) – Deepak

0

您可以添加像這樣的動作事件。

JButton b1 = new JButton(); 
b1.addActionListener(this); 

那麼你必須使這個類

public void actionPerfomed(ActionEvent ae){ 
    if(ae.getSource()==b1){ 
     //your commands here 
    } 
} 

注:確保implent ActionListener

相關問題