在我的面向对象编程类(class)中,我们最近的主题是通过 JavaFX 进行事件驱动编程。这些概念相对有趣,尽管有时让我很困惑。我非常难以理解的一件事是 setOnAction() 方法的工作原理。
正如我的老师所说,此方法接受具有句柄方法的类的对象,并在事件触发时调用该句柄方法。
例如在我们的 start
方法中:
class MyHandler implements EventHandler<ActionEvent> {
@Override
public void handle(ActionEvent actionEvent) {
System.out.println("Handled");
}
}
Button button = new Button();
button.setOnAction(new MyHandler());
但是,我无法理解它的幕后工作原理。 setOnAction
方法到底如何“知道”调用 MyHandler
对象的句柄方法?是否可以实现我自己的 setOnAction
版本,在其中调用任何传入对象的专门命名的方法?
如果我们根本不实现句柄方法,而是使用一个 fakeHandle
方法,就像这样,会怎么样。
class MyHandler {
public void fakeHandle(ActionEvent actionEvent) {
System.out.println("Handled");
}
}
Button button = new Button();
button.setOnAction(new MyHandler());
我们的代码还能工作吗?
最佳答案
As my instructor said, this method takes in an object of a class that has a handle method, and calls that handle method whenever an event is fired.
我怀疑这里发生了轻微的误解或用词不当。您不能传递任何其类定义 handle(ActionEvent)
的任意对象方法setOnAction
方法。 setOnAction
方法被定义为接受 EventHandler<ActionEvent>
实现,该接口(interface)定义了 handle
方法。
这正是接口(interface)的用途。他们定义了所有实现都必须遵循的契约(Contract)。您传递给 setOnAction
的对象并不重要。只要它的类实现 EventHandler<ActionEvent>
。这就是 JavaFX 了解 handle
的方式。方法,因为它知道 EventHandler
界面。
您的第二个代码示例将无法编译,因为 myHandler
没有实现EventHandler<ActionEvent>
。但即使它做到了你的fakeHandle
方法不会被调用(由 JavaFX 代码),因为 JavaFX 不知道它。
准确解释整个事件处理过程在 JavaFX 中的底层工作原理是一个深入的过程。如果你真的想理解这一点,那么我建议你阅读代码——JavaFX is open source 。但是,如果您只想从用户的角度(即 API 级别)了解事件处理,那么 this tutorial应该有帮助。
关于java - JavaFx 的 setOnAction 方法在幕后是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64743736/