JavaFX 在 EventHandler 中使用超类

JavaFX use superclass in EventHandler

我有多个控制器-classes,它们扩展了另一个控制器。当我在扩展控制器中创建事件处理程序时-class,我无法使用"super.something"。它在普通方法中工作,但在 EventHandler 中不起作用。还有其他选择吗?

这里是一个小例子摘录:

public class ViewController {

    @FXML
    private TextField idField;

    public TextField getIdField() {
        return idField;
    }
}   

-

public class ExtendingViewController extends ViewController {

    @FXML
    private Label testLabel;

    private EventHandler<ActionEvent> createBtnHandler = new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent event) {

               //This does not work. "super" does not seem to exist in this method.
               testLabel.setText(super.getIdField());

            }
        };
    }

    public void testMethod(){
        //this does work
        testLabel.setText(super.getIdField());
    }
}

这不起作用,因为 super 是相对引用。 当从 testMethod 引用 super 时,super 是 ViewController,但当从 createBtnHandler 引用 super 时,super 是 EventHandler super class。 (事件处理程序继承自对象,因此对象将是超级对象) 参见 - https://docs.oracle.com/javase/8/javafx/api/javafx/event/EventHandler.html

要完成这项工作,您可以创建一个继承 EventHander 的 class 并传递对您要调用的方法的引用。

public class CustomEventHandler implements EventHandler<ActionEvent> {
    private IEventsHandler mEventsHandler;

    public CustomEventHandler(IEventsHandler eventsHandler)
    {
        mEventsHandler = eventsHandler;
    }

    @Override
    public void handle(ActionEvent event) {
        mEventsHandler.testMethod();
    }
}

public interface IEventsHandler {
    void testMethod();
}


public class ExtendingViewController extends ViewController implements IEventsHandler  {

    @FXML
    private Label testLabel;

    private EventHandler<ActionEvent> createBtnHandler = new CustomEventHandler(this);

    public void testMethod(){
        testLabel.setText(super.getIdField());
    }
}

这里不用super。如果你遗漏了 super.,java 编译器会检查匿名 class 中是否有 getIdField 方法,因为它没有找到,它会检查包含的 class 对于这种方法。 (在 testMethod 中使用 superthis 不会改变结果,因为 getIdField 不会在 ExtendingViewController 中被覆盖。)

testLabel.setText(getIdField().getText());

然而,您可以使用 ContainingClass.super:

访问包含 class 的 superclass 的成员
private EventHandler<ActionEvent> createBtnHandler = new EventHandler<ActionEvent>() {
    @Override
    public void handle(ActionEvent event) {
        testLabel.setText(ExtendingViewController.super.getIdField().getText());
    }
};