[英]JavaFX Event Handling Mystery - Code removed and events still handled?
我對Java和C#等OOP語言很有經驗。 直到現在,再也沒有碰過FX,並開始在辦公室里無聊地處理事件。
我的FX應用程序全部編寫在一個類中。 我導入了我想要的軟件包,包括以下兩個:
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
我在Main類聲明上使用ActionEvent類型實現了EventHandler接口,如下所示:
public class Main extends Application implements EventHandler<ActionEvent>
我在按鈕對象上編寫了一個匿名內部類,以處理單擊事件,例如。
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
您沒有刪除事件處理所需的代碼:
public class Main extends Application implements EventHandler<ActionEvent>
不需要使用Main
類實現EventHandler<ActionEvent>
,因為無論如何您都使用匿名類作為事件處理程序,而不是
btnButton.setOnAction(this);
(假設this
引用了Main
實例)
lambdas的另一個好處是,只要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"));
“滿足”編譯器。
這將是不同的,如果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"));
如果您有興趣在規范中查找相關內容,請參見以下相關部分:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.