2017-03-31 366 views
1

我在Java和C#等OOP語言方面經驗豐富。直到現在,從來沒有與FX搞混,開始在辦公室裏忙於處理無聊事件。JavaFX事件處理之謎 - 代碼已被刪除且事件仍處理?

我的FX應用程序全部編寫在一個類中。我輸入我想要的軟件包,包括這兩個:

import javafx.event.ActionEvent; 
import javafx.event.EventHandler; 

我實現了事件處理程序接口與我的主類聲明,像這樣類型的ActionEvent ..

public class Main extends Application implements EventHandler<ActionEvent> 

我在寫一個匿名內部類按鈕對象來處理click事件,像這樣..

btnButton.setOnAction(new EventHandler<ActionEvent>(){ 
     public void handle(ActionEvent event) { 
      System.out.println("I got clicked"); 
     } 
}); 

顯然,它的工作就像它應該但後來我跑了一個實驗。我從上面刪除了兩個進口。我刪除了Main類聲明的「implements」部分。這使我的應用程序沒有任何事件處理的參考。然後我又回到了我的按鈕對象並寫下了事件處理程序,像這樣一個lambda表達式...

btnButton.setOnAction(e -> System.out.println("I got touched")); 

你猜怎麼着?它仍然工作!這是不可能的..有人可以解釋如何刪除處理事件所需的代碼後仍然工作?這有點有趣,它讓我心生疑慮。

在此先感謝您的回覆!

-KeplerIO

+0

據我瞭解,從[這裏](https://docs.oracle.com/javase/tutorial/java/javaOO/ lambdaexpressions.html),lambda表達式已經是默認的Java 8庫的一部分,並且完全理解如何自動處理多個構造。這包括按鈕操作。 – Sedrick

回答

2

你沒有刪除所需的代碼事件處理:

public class Main extends Application implements EventHandler<ActionEvent> 

Main類實現EventHandler<ActionEvent>從來沒有要求,因爲你使用的是anonymus類作爲事件處理反正,代替

btnButton.setOnAction(this); 

(假設第this引用這裏ËMain實例)

同樣的lambda表達式的好處之一是,你可以,只要Java編譯器仍然能夠確定你實現接口(以及由此的簽名省去參數類型方法)毫不含糊地。

在這種情況下setOnAction方法沒有過載和Java編譯器可以確保所述參數是EventHandler<ActionEvent>型的,並且該方法的實施的簽名是

public void handle(ActionEvent event) 

因此

btnButton.setOnAction((ActionEvent e) -> System.out.println("I got touched")); 

甚至

btnButton.setOnAction(e -> System.out.println("I got touched")); 

「sati sfies「編譯器。


這將是不同的,如果setOnAction方法超載Button

public void setOnAction(Consumer<Integer> x) { ... } 

在這種情況下,編譯器會需要額外的信息來確定該方法使用:

btnButton.setOnAction((Integer a) -> System.out.println("something")); 
btnButton.setOnAction((ActionEvent a) -> System.out.println("something")); 
btnButton.setOnAction((Consumer<Integer>) a -> System.out.println("something")); 
btnButton.setOnAction((EventHandler<ActionEvent>) a -> System.out.println("something")); 

如果您有興趣在規範中查找,這裏的相關章節:

+0

謝謝你的答案!我可能沒有在我的問題中說清楚,但是我確實刪除了主類和進口的「實施」聲明。但從你的回答中,我可以收集到.setOnAction自動爲我們做出所有想法,這就是事件仍然如此處理!我現在明白了很多。謝謝你,朋友! – KeplerIO