java - JavaFx 的 setOnAction 方法在幕后是如何工作的?

标签 java javafx event-handling

在我的面向对象编程类(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/

相关文章:

java - 无法在 Netbeans IDE 打包的浏览器中运行简单的 JavaFX

java - StackPane 中的居中弹出 Pane

c# - 如何在 Windows 应用程序中处理 Ctrl + Break 或 Ctrl + Pause

event-handling - jQuery 事件处理程序 .on() 不起作用

java - 带有 SequenceGenerator 和 generatedValue 的 JPA

java - 在 MainActivity 上显示 recyclerView

javafx - 为什么 TableView 的更改监听器对 JavaFX8 中的 ObjectProperty<T> 与 TProperty 列给出不同的结果?

javascript - 在立即执行的函数中获取 "event"对象?

java - 如何自定义 Optional 类中 NoSuchElementException 的错误信息

java - 设备中的应用名称