Как использовать один и тот же метод в двух разных классах (JavaFX с Scenebuilder)? - PullRequest
0 голосов
/ 18 сентября 2018

Я сейчас экспериментирую с JavaFX и SceneBuilder в затмении, чтобы создать и спроектировать свою собственную программу.В моем первом классе "StartController" я использую метод с именем makeFadeIn .В основном, когда я нажимаю кнопку, другая страница загружается с эффектом исчезновения.

Это код из StartController.java (обратите внимание, makeFadeIn):

public class StartController {

@FXML
private AnchorPane rootPane;

private void makeFadeIn() {
    FadeTransition fadeTransition = new FadeTransition();
    fadeTransition.setDuration(Duration.millis(1000));
    fadeTransition.setNode(rootPane);
    fadeTransition.setFromValue(0);
    fadeTransition.setToValue(1);
    fadeTransition.play();
}

@FXML
private void loadSecondPage(ActionEvent event) throws IOException {
    AnchorPane startPage = FXMLLoader.load(getClass().getResource("SecondController.fxml"));
    rootPane.getChildren().setAll(startPage);
    makeFadeIn();
}

Далее загружается другой мой класс, который называется "SecondController.java".В этом классе я использую точно такой же метод makeFadeIn (но мне пришлось написать его дважды, поскольку он не позволил мне запустить программу).

Это код из SecondController.java:

public class SecondController {

@FXML
private AnchorPane rootPane;

private void makeFadeIn() {
    FadeTransition fadeTransition = new FadeTransition();
    fadeTransition.setDuration(Duration.millis(1000));
    fadeTransition.setNode(rootPane);
    fadeTransition.setFromValue(0);
    fadeTransition.setToValue(1);
    fadeTransition.play();
}

@FXML
private void loadFirstPage(ActionEvent event) throws IOException {
    AnchorPane startPage = FXMLLoader.load(getClass().getResource("StartController.fxml"));
    rootPane.getChildren().setAll(startPage);
}

Мой вопрос: могу ли я как-то вызвать метод makeFadeIn из первого класса, чтобы мне не нужно было писать его в моемВторой класс?Я думаю, мне нужно как-то унаследовать это, но я не знаю как.Я попытался объявить его публичным, а не частным, но это не сильно помогло.

1 Ответ

0 голосов
/ 18 сентября 2018

Вы можете переместить эту функциональность в базовый класс:

public class BaseController {

    @FXML
    private AnchorPane rootPane;

    protected AnchorPane getRootPage() {
        return rootPane;
    }

    protected void makeFadeIn() {
        FadeTransition fadeTransition = new FadeTransition();
        fadeTransition.setDuration(Duration.millis(1000));
        fadeTransition.setNode(rootPane);
        fadeTransition.setFromValue(0);
        fadeTransition.setToValue(1);
        fadeTransition.play();
    }
}

, а затем заставить другие контроллеры расширить его:

public class StartController extends BaseController {

    @FXML
    private void loadSecondPage(ActionEvent event) throws IOException {
        AnchorPane startPage = 
            FXMLLoader.load(getClass().getResource("SecondController.fxml"));
        getRootPane().getChildren().setAll(startPage);
        makeFadeIn();
    }
}

public class SecondController extends BaseController {

    @FXML
    private void loadFirstPage(ActionEvent event) throws IOException {
        AnchorPane startPage = 
            FXMLLoader.load(getClass().getResource("StartController.fxml"));
        getRootPane().getChildren().setAll(startPage);
    }
}
...