JavaFX在EventHandler中使用超类

JavaFX在EventHandler中使用超类,java,inheritance,javafx,extends,super,Java,Inheritance,Javafx,Extends,Super,我有多个控制器类,它们扩展了另一个控制器。在扩展控制器类中创建EventHandler时,不能使用“super.something”。它在普通方法中工作,但在EventHandler中不工作。还有其他选择吗 下面是一个小例子摘录: public class ViewController { @FXML private TextField idField; public TextField getIdField() { return idField;

我有多个控制器类,它们扩展了另一个控制器。在扩展控制器类中创建EventHandler时,不能使用“super.something”。它在普通方法中工作,但在EventHandler中不工作。还有其他选择吗

下面是一个小例子摘录:

public class ViewController {

    @FXML
    private TextField idField;

    public TextField getIdField() {
        return idField;
    }
}   
-

公共类扩展ViewController扩展ViewController{
@FXML
自有品牌testLabel;
私有EventHandler createBtnHandler=新的EventHandler(){
@凌驾
公共无效句柄(ActionEvent事件){
//这不起作用。这种方法中似乎不存在“超级”。
testLabel.setText(super.getIdField());
}
};
}
公共void testMethod(){
//这确实有效
testLabel.setText(super.getIdField());
}
}

这不起作用,因为super是一个相对引用。 从
testMethod
super引用super时,super是
ViewController
,但从
createBtnHandler
super引用super时,super是
EventHandler
超类。 (事件处理程序从对象继承,因此对象将是超级对象) 见-

为了实现这一点,您可以创建一个继承
EventHander
的类,并传递对您想要调用的方法的引用

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());
    }
}
公共类CustomEventHandler实现EventHandler{
私有的IEventsHandler-mEventsHandler;
公共CustomEventHandler(IEventsHandler eventsHandler)
{
mEventsHandler=eventsHandler;
}
@凌驾
公共无效句柄(ActionEvent事件){
mEventsHandler.testMethod();
}
}
公共接口IEventHandler{
void testMethod();
}
公共类ExtendingViewController扩展ViewController实现IEventHandler{
@FXML
自有品牌testLabel;
private EventHandler createBtnHandler=新的CustomEventHandler(此);
公共void testMethod(){
testLabel.setText(super.getIdField());
}
}

这里不需要使用
super
。如果省略了
super.
,java编译器将检查anonymus类中是否有
getIdField
方法,并且由于找不到该方法,因此会检查包含该方法的类。(在
testMethod
中使用
super
不会更改结果,因为
getIdField
ExtendingViewController
中不会被覆盖)

但是,您可以使用
ContainingClass.super
访问包含类的超类的成员:

private EventHandler<ActionEvent> createBtnHandler = new EventHandler<ActionEvent>() {
    @Override
    public void handle(ActionEvent event) {
        testLabel.setText(ExtendingViewController.super.getIdField().getText());
    }
};
private EventHandler createBtnHandler=new EventHandler(){
@凌驾
公共无效句柄(ActionEvent事件){
testLabel.setText(ExtendingViewController.super.getIdField().getText());
}
};

如果没有
super.
,它能工作吗?实际上,在这个问题中使用的
EventHandler
不是这个,而是这个。
testLabel.setText(getIdField().getText());
private EventHandler<ActionEvent> createBtnHandler = new EventHandler<ActionEvent>() {
    @Override
    public void handle(ActionEvent event) {
        testLabel.setText(ExtendingViewController.super.getIdField().getText());
    }
};