JavaFX在EventHandler中使用超类

时间:2018-11-08 14:58:05

标签: java inheritance javafx extends super

我有多个控制器类,它们扩展了另一个控制器。当我在扩展控制器类中创建EventHandler时,不能使用“ 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());
    }
}

2 个答案:

答案 0 :(得分:2)

这里不需要使用super。如果省略了super.,则Java编译器将检查匿名类中的getIdField方法,由于找不到该方法,因此它将检查此方法的包含类。 (在super中使用thistestMethod不会改变结果,因为getIdField中的ExtendingViewController不会被覆盖。)

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

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

private EventHandler<ActionEvent> createBtnHandler = new EventHandler<ActionEvent>() {
    @Override
    public void handle(ActionEvent event) {
        testLabel.setText(ExtendingViewController.super.getIdField().getText());
    }
};

答案 1 :(得分:0)

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

要完成这项工作,您可以创建一个继承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());
    }
}