gpt4 book ai didi

JavaFX 事件处理之谜 - 代码被删除但事件仍然被处理?

转载 作者:行者123 更新时间:2023-11-30 02:35:45 25 4
gpt4 key购买 nike

我对 Java 和 C# 等 OOP 语言非常有经验。直到现在才开始接触 FX,出于在办公室的无聊而开始尝试处理事件。

我的 FX 应用程序都是在一个类中编写的。我导入了我想要的包,包括这两个:

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

我在主类声明上使用 ActionEvent 类型实现了 EventHandler 接口(interface),如下所示..

public class Main extends Application implements EventHandler<ActionEvent>

我在按钮对象上编写了一个匿名内部类来处理像这样的点击事件..

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

它显然按应有的方式工作,但后来我进行了一个实验。我删除了上面的两个导入。我删除了主类声明的“实现”部分。这使得我的应用程序没有任何事件处理的引用。然后我回到按钮对象并将事件处理程序编写为 lambda 表达式,如下所示...

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

你猜怎么着?它仍然有效!这是不可能的。有人可以解释一下在删除处理事件所需的代码后这仍然如何工作吗?这有点有趣,让我大吃一惊。

提前感谢您的回复!

-KeplerIO

最佳答案

您没有删除事件处理所需的代码:

public class Main extends Application implements EventHandler<ActionEvent>

实现EventHandler<ActionEvent>Main类从来都不是必需的,因为无论如何您都使用匿名类作为事件处理程序,而不是

btnButton.setOnAction(this);

(假设 this 引用此处的 Main 实例)

lambda 的好处之一是,只要 java 编译器仍然能够明确确定您正在实现的接口(interface)(从而确定方法的签名),您就可以省略参数类型。

在本例中 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"));
<小时/>

如果您有兴趣在规范中查找此内容,以下是相关部分:

关于JavaFX 事件处理之谜 - 代码被删除但事件仍然被处理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43151199/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com