【问题标题】:JavaFX: execute events in Sub- and in SuperClassJavaFX:在子类和超类中执行事件
【发布时间】:2020-10-29 09:29:34
【问题描述】:

如果我像这样在 SuperClass 中实现 onMouseClicked-EventHandler:

public class SuperClass {
    public SuperClass() {
                
        setOnMouseClicked(new EventHandler<Event>() {
            @Override
            public void handle(Event event) {
                System.out.println("Super reacted");
            }
        });
    }

我在 SuperClass 的子类中实现了一个 onMouseClicked-EventHandler,如下所示:

public class SubClass extends SuperClass{
    public SubClass() {
                
        setOnMouseClicked(new EventHandler<Event>() {
            @Override
            public void handle(Event event) {
                System.out.println("Sub reacted");
        });
    }
}

单击 SubClass 的实例后,控制台中的结果将是“Sub reacted”。所以 SuperClass 不会注意到这个事件。

我怎样才能以某种方式转发事件,让所有超类也做出反应?我想过在子类中手动触发一个事件,但它不起作用。

感谢您的帮助。

【问题讨论】:

  • 为什么要在 class 层次结构的不同级别上使用不同的处理程序?你真正想要实现什么(感觉像是一个 xy 问题)?

标签: javafx subclass superclass eventhandler


【解决方案1】:

在 JavaFX 中有两种注册小部件的方法:

  • setOnMouseClicked(所有 setOn... 方法)。与 setOnMouseClicked 关联的处理程序是唯一的:在您的情况下,子类注册替换了在超类中进行的注册。
  • addEventHandler(或AddEventFilter)。在这种情况下,您可以拥有多个向同一个小部件注册的处理程序。这些方法作为参数:你想监听的事件类型; EventHandler&lt;&gt; 类型的实例,您可以将其编写为回调或匿名类。 在您的情况下:
addEventHandler(MouseEvent.MOUSE_CLICKED, evt -> {
 // ... 
});

或使用匿名类:

addEventHandler(MouseEvent.MOUSE_CLICKED, new EventHandler<MouseEvent>() {
   @Override
   public void handle(final MouseEvent evt) {
   }
});

其中evt 是触发的鼠标点击事件。

使用addEventHandler 应该可以解决您的问题。

【讨论】:

    猜你喜欢
    • 2017-02-18
    • 1970-01-01
    • 2014-03-23
    • 1970-01-01
    • 2016-12-08
    • 2014-12-28
    • 2019-04-12
    相关资源
    最近更新 更多