为什么JavaFX事件处理的设计使我们必须创建一个包含handle()方法的类的实例?

时间:2016-11-25 14:47:15

标签: javafx

在JavaFx中,我理解如果我想要一个按钮在单击时运行一些代码,我需要以某种方式拥有我想要在方法中运行的代码,并且因为这是Java,我将它包装起来扩展EventHandler的类中的方法。例如:

// (myButton is a reference variable to a Button object)
myButton.setOnAction(new MyButtonEventHandlerClass() );

// inner class
public class MyButtonEventHandlerClass extends EventHandler<ActionEvent>{
  public void handle(ActionEvent e) {
    // (some code)
  }
}

我的困惑是:为什么JavaFX旨在要求我创建一个包含handle()方法的类的实例?我曾想过当使用对象的实例变量时会使用非静态方法;换句话说,如果你只需要一个不需要对象的方法,那么你应该使用静态方法。在这种想法中,handle()听起来应该是一个静态方法。

为什么handle()不是静态方法?

1 个答案:

答案 0 :(得分:1)

EventHandler在这种情况下以有意义的方式工作的标准是:

  1. 需要某种方式来存储信息。
  2. 信息必须以允许多种方式处理事件的方式存储。
  3. 现在无论实际使用handle和/或封闭类中的任何字段的EventHandler方法,都需要有一种方法来识别应该处理事件的代码。
    如果handle只是一个static方法,那么只有一个处理程序,更糟糕的是由JavaFX程序员决定,因为static方法无法被覆盖。如果没有非2.方法,则无法满足条件static

    对于非静态方法,处理此问题非常简单。可以重写方法并处理事件,只需通过为事件处理程序对象调用EventHandler.handle来完成正确的方法。

    在java 8中,方法引用(或lambda表达式)可以通过使用方法引用来缩短这一点,这允许您使用方法作为接口实例&#34;:

    public class MyClass {
    
         public static void handleMyButtonAction(ActionEvent evt) {
             // (some code)
         }
    
    }
    
    myButton.setOnAction(MyClass::handleMyButtonAction);