本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长


+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

暂无数据

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

发布于2021-11-23 04:46     阅读(545)     评论(0)     点赞(1)     收藏(4)


在我的面向对象编程课程中,我们最近的主题是通过 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对象的handle方法的是否可以实现我自己的 a 版本setOnAction,在其中我调用任何传入对象的特定命名方法?

如果我们根本不实现 handle 方法,而是说fakeHandle,像这样方法呢?

class MyHandler {
        public void fakeHandle(ActionEvent actionEvent) {
            System.out.println("Handled");
        }
    }

Button button = new Button();
button.setOnAction(new MyHandler());

我们的代码还能用吗?


解决方案


正如我的导师所说,这个方法接受一个类的对象,该对象有一个句柄方法,并在触发事件时调用该句柄方法。

我怀疑这里发生了轻微的误解或措辞不当。您不能将任何其类定义了handle(ActionEvent)方法的任意对象传递给该setOnAction方法。setOnAction方法被定义为接受一个EventHandler<ActionEvent>实现,而正是该接口定义了该handle方法。

这正是接口的用途。他们定义了所有实现都必须遵循的契约。传递给什么对象并不重要setOnAction,只要它的类实现EventHandler<ActionEvent>. 这就是 JavaFX 知道handle方法的方式,因为它知道EventHandler接口。

您的第二个代码示例将无法编译,因为myHandler没有实现EventHandler<ActionEvent>. 但即使这样做了,您的fakeHandle方法也不会被调用(通过 JavaFX 代码),因为 JavaFX 不知道它。


准确解释整个事件处理过程在 JavaFX 中是如何在后台工作的,这是一个深入的过程。如果您真的想了解这一点,那么我建议您阅读代码——JavaFX 是开源的但是,如果您只想从用户的角度(即 API 级别)了解事件处理,那么本教程应该会有所帮助。



所属网站分类: 技术文章 > 问答

作者:黑洞官方问答小能手

链接:http://www.javaheidong.com/blog/article/328717/9c4000946e324b104885/

来源:java黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

1 0
收藏该文
已收藏

评论内容:(最多支持255个字符)