JavaFX использует суперкласс в EventHandler - PullRequest
0 голосов
/ 08 ноября 2018

У меня есть несколько классов контроллеров, которые расширяют другой контроллер. Когда я создаю 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 голосов
/ 08 ноября 2018

Здесь нет необходимости использовать super. Если вы пропустите super., компилятор java проверяет класс anonymus на метод getIdField и, поскольку он не находит его, проверяет содержащий класс для этого метода. (Использование super или this в testMethod не меняет результат, поскольку 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());
    }
};
0 голосов
/ 08 ноября 2018

Это не работает, потому что супер является относительной ссылкой. При ссылке на супер из testMethod супер - это ViewController, но при ссылке на супер из createBtnHandler супер - это класс 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());
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...