当前位置: 首页 > 知识库问答 >
问题:

JavaFX事件处理之谜-代码已删除,事件仍在处理?

苗阳文
2023-03-14

我在Java和C#等OOP语言方面非常有经验。直到现在,我才开始与FX打交道,并开始在办公室无聊地处理事件。

我的外汇申请都是在一个类中编写的。我导入了我想要的软件包,包括以下两个:

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

我在主类声明中实现了类型为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 类声明的“实现”部分。这使我的应用程序没有任何对事件处理的引用。然后,我回到我的按钮对象,并将事件处理程序编写为lambda表达式,如下所示...

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

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

提前感谢您的回复!

-开普勒里奥

共有1个答案

空夕
2023-03-14

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

public class Main extends Application implements EventHandler<ActionEvent>

实现< code >事件处理程序

btnButton.setOnAction(this);

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

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

在这种情况下,setOnAction方法没有重载,java编译器可以确保参数的类型为EventHandler

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")); 

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

  • JLS: 15.表达 式

 类似资料:
  • 我有一个非常基本的JavaFX项目,只有一个锚窗格和一个标签。这个想法是当你按下键盘上的一个按钮时,标签就会变成你按下的键。

  • 我正在使用javafx创建一个扫雷克隆,如果有人玩过原始游戏,他们可能会记得当你按下一个磁贴并四处移动时,其他磁贴的行为就好像它们也在被按下一样...如果你放手-即使你最初按下的是一个完全不同的节点,你鼠标当前所在的节点也会被点击。我很难重新创建这个,我需要一些帮助。 我正在使用全局事件处理程序类,我不太确定这是好是坏......但是,让我的克隆的事件单独处理感觉很好。我尝试过在事件发生的节点上使

  • 我正在开发一个小应用程序,在创建菜单栏时遇到了一个问题。这是我的开始方法: 我遇到的问题在代码的这一部分: 我试图从数组列表中创建子菜单的条目。这些数据从数据库中获取,并以数组列表的形式返回。除了pairNameMenu.getItems()之外,我没有找到其他方法来做菜单项。add(new MenuItem(item));在for循环中。 现在我想处理项目中的点击,但我不知道如何操作。我试过使用

  • 事件 事件,就是文档与浏览器发生特定的 交互瞬间。JavaScript与HTML之间的交互就是通过事件实现的。 事件流 所谓事件流,就是接收页面事件的顺序。 事件流分 事件冒泡流 与 事件捕获流。事件冒泡流是IE开发团队提出的,捕获流是Netscape开发团队提出的。 事件冒泡流 所谓事件冒泡,就是事件开始时由 最具体的元素(文档中嵌套最深的那个 节点)接收,然后逐级向上传播到较为不具体的节点(文

  • 我们需要在constructor中对于事件与对应的handler函数进行绑定. 大多数时候我们在发出DOM事件的组件内部写我们的handler函数. 在下面的例子中,我们在组件内部创建了一个click handler, 因为我们想所有的Swithcer Component当被点击时,做出同样的响应. class Switcher extends React.Component { render

  • 我不喜欢流口水。我正在尝试使用Drools Fusion编写一个简单的复杂事件处理(CEP)应用程序。 我的要求是 我有一个简单的Event类,如下所示: 规则文件如下: 为了进行测试,我将向工作内存中注入4个事件,分别是e1、e2、e3、e4,时间线分别为0m、4m、10m、12m。 Jave类文件 我希望e1通过规则,因为它没有前面的事件。我还预计e3将通过,因为前面的比赛还有6分钟。 但是,