簡體   English   中英

JavaFX事件處理之謎-代碼已刪除,事件仍在處理嗎?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM