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

这些在JavaFX中使用事件的方法是否相同?[重复]

姚新霁
2023-03-14

我有一个按钮,当我将鼠标悬停在按钮上时,我希望显示一个文本。

这两者都可以工作,但它们可以互换使用吗?

// First
EventHandler<MouseEvent> eventHandler = new EventHandler<MouseEvent>() {
    @Override
    public void handle(MouseEvent e) {
        System.out.println("Hello World");
    }
};
button.setOnMouseEntered(eventHandler);

// Second. Lambda expression.
button.setOnMouseEntered(e -> {
    System.out.println("Hello ");
});

我不太明白第一个。我想EventHandler


共有3个答案

饶承宣
2023-03-14

已经提供的两个答案都很好,但我想补充另一个考虑因素。

只要有可能,lambda是更可取的,不仅因为它们更容易阅读,而且它们在编译时还会产生非常不同的字节码。

在第一个示例中,编译器创建了一个单独的类(例如:OuterClass1美元)。这个类必须在每次调用时实例化,在某个时候必须进行垃圾收集。

在第二个示例中,lambda被编译为包含类的局部方法。这意味着它只是一个简单的方法调用。

根据调用频率的不同,这可能是一个重要的考虑因素。

卢志强
2023-03-14

第一个是匿名内部类,其中重写了句柄方法。这是在lambda表达式之前执行侦听器和处理程序的方法。现在,如果该类是一个函数接口(只有1个抽象方法,例如您的案例中的EventHandler及其唯一方法,句柄),那么可以使用lambda表达式代替anonim类。

这两种方法确实相同,但首选使用lambda,因为代码会更紧凑、更容易理解。

王辉
2023-03-14

是的,它们都将执行相同的代码。

第一个是所谓的匿名类。这意味着您可以直接重写继承接口的方法(在本例中为句柄),而无需使用其他类/接口。

然后将处理程序实例传递给SetonMouseEnter方法。

lambda表达式也可以做到这一点,但由于该方法需要特定的对象类型,因此可以使用lambda表达式将其写得更短。

e与eventHandler基本相同

 类似资料:
  • 我刚刚意识到我让一个班级成员不必要地保持静态。我想知道这是否有意义,或者它们之间有什么区别。所以我有: 或 所以你可以看到,这个GUI类总是通过作用域操作符GUI::而不是点成员操作符来访问,我不会创建它的任何实例,它是完全静态的。因此,两个GUI类中的int和Foo对象要么有“static”关键字,要么没有。在GUI类不会被实例化的情况下,我不相信这会有什么不同。作为一种最佳实践,是否最好不使用

  • 我有一个JavaFX按钮,当用户按Enter时触发。这会导致FileChooser打开。有些人(像我一样)可能会在FileChooser中点击Enter来保存文件。但是,这会导致保存按钮再次触发自身并再次打开FileChooser以保存新文件。用鼠标单击按钮(在FileChooser中)没有这个问题。 我以为从按钮中使用事件会解决这个问题,但它只使用GUI事件上的按钮,而不是FileChooser

  • 我在Stack上看了很多类似这个问题的链接,决定问一下。 当我用Java创建一个抽象形状类时,我认为这个类必须有一个方法来< code>getArea() 我认为有两种方法。 当我从 Shape 创建扩展类时,我在扩展类中重新定义了 getArea()。 那么我可以像这样使用< code>Interface来创建这个层次结构吗? 并像这样创建类: 然后重新定义 getArea() 以扩展 Shap

  • 问题内容: 在一个初级Oracle开发人员职位的面试中有人问我这个问题,面试官承认这是一个艰难的过程: 编写查询以检查表’employees_hist’是否与表’employees’完全相同。任何想法如何去做? 编辑:考虑到表可以有重复的记录,因此在这种情况下,简单的MINUS将不起作用。 例子 这两个是不一样的。 问题答案: 解决重复项的一种可能的解决方案是创建一个子查询,该子查询对两个表执行U

  • 问题内容: 和 第二个代码产生了一个空指针异常,该怎么做才能使下一个等效? 问题答案: 我可以看到,如果players某个自定义java.lang.Iterable的get()实现的实现被破坏,或者至少以一种异常的方式(与的行为不同),就会发生这种情况。 除此之外,我唯一能想到的就是您未在代码中向我们展示的某些内容导致了某些错误。 如果执行此操作会怎样?

  • 我有一个将超时更改的,我想将其与时间值一起存储并检查是否再次出现相同的。 前任: 我想既然