【问题标题】:Are these methods of using event identical in JavaFX? [duplicate]这些在 JavaFX 中使用事件的方法是否相同? [复制]
【发布时间】:2019-10-01 16:41:36
【问题描述】:

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

这两种方法都有效,但它们可以互换使用吗?

// 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&lt;MouseEvent&gt; 是类型,eventHandler 是对象的名称。正确的?

【问题讨论】:

    标签: java lambda anonymous-class


    【解决方案1】:

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

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

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

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

    eeventHandler

    基本相同

    【讨论】:

      【解决方案2】:

      第一个是匿名内部类,其中handle 方法被覆盖。这是在 lambda 表达式之前执行侦听器和处理程序的方法。现在,如果该类是一个函数式接口(只有 1 个抽象方法,如您的情况中的 EventHandler 及其唯一方法 handle),则可以使用 lambda 表达式代替匿名类。

      这两种方法确实是一样的,但最好使用 lambda,因为代码会更紧凑,更容易理解。

      【讨论】:

        【解决方案3】:

        已经提供的两个答案都很好,但我想补充一点。

        只要可能,最好使用 lambda,不仅因为它们更易于阅读,而且它们在编译时会产生非常不同的字节码。

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

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

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

        【讨论】:

          【解决方案4】:

          我相信第一个例子可以明确写成:

          private class MouseHandler implements EventHandler<MouseEvent> {
              public void handle(MouseEvent e) {
                  System.out.println("Hello World");
              }
          }
          button.setOnMouseEntered(new MouseHandler());
          

          这可以通过匿名类和 lambda 表达式来减少。我的理解是,这只是可能的,因为 EventHandler 是一个功能接口。 What is a functional interface in Java SKO

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-05-18
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-11-07
            • 1970-01-01
            相关资源
            最近更新 更多