在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()不是静态方法?
答案 0 :(得分:1)
EventHandler
在这种情况下以有意义的方式工作的标准是:
现在无论实际使用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);