JavaFX - возврат к предыдущей сцене с отдельными классами - PullRequest
0 голосов
/ 31 марта 2020

Я сделал очень простой GUI с некоторыми кнопками и стилем. На 2 из 4 сцен есть кнопка «Go Back», которая, как говорится, должна вернуть вас к предыдущей сцене. Обычно, когда сцена установлена ​​в методе start, вы можете просто сделать

stage.setScene(scene);

Но у меня не установлена ​​сцена в методе main start. Вместо этого мои сцены распределены по разным классам, например:

Main

public class Main extends Application {

    Stage window;
    Scene mainScene;

    @Override
    public void start(Stage stage) throws Exception {
        window = stage;
        window.setTitle("Main screen");
        MainView mainView = new MainView(window);

        window.setOnCloseRequest(e -> {
            e.consume();
            mainView.closeApplication(window);
        });

        mainScene = new Scene(mainView, 900, 600);
        window.setScene(mainScene);
        window.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}

MainView

public class MainView extends VBox {
    public MainView(Stage window) {
        setSpacing(10);
        setPadding(new Insets(20,20,20,20));
        setAlignment(Pos.CENTER);
        setStyle("-fx-background-color: #1da1f2;");

        Label title = new Label("Project 2.3 SE");
        title.setTextFill(Color.WHITE);
        title.setFont(new Font("Arial", 30));

        Button chooseGame = new Button("Play");
        Button options = new Button("Options");
        Button close = new Button("Exit");

        chooseGame.setMinWidth(100);
        options.setMinWidth(100);
        close.setMinWidth(100);

        // Wanneer men een game kiest veranderd de scene naar een nieuwe scene
        ChooseGameView chooseGameView = new ChooseGameView(window);
        Scene chooseGameScene = new Scene(chooseGameView, 900, 600);

        chooseGame.setOnAction(e -> {
            window.setScene(chooseGameScene);
            window.setTitle("Choose a game");
        });

        close.setOnAction(e -> {
            closeApplication(window);
        });

        getChildren().addAll(title, chooseGame, options, close);
    }
}

GameView

public class ChooseGameView extends VBox {

    public ChooseGameView(Stage window) {
        setSpacing(10);
        setPadding(new Insets(20,20,20,20));
        setAlignment(Pos.CENTER);
        setStyle("-fx-background-color: #1da1f2;");

        Label chooseGameTitle = new Label("Choose a game to play");
        chooseGameTitle.setTextFill(Color.WHITE);
        chooseGameTitle.setFont(new Font("Arial", 30));
        Button chooseTTT = new Button("Tic Tac Toe");
        Button reversi = new Button("Reversi");
        Button back = new Button("Go back");

        chooseTTT.setMinWidth(100);
        reversi.setMinWidth(100);
        back.setMinWidth(100);

        ChooseGameModeView chooseGameModeView = new ChooseGameModeView(window);
        Scene chooseGameModeViewScene = new Scene(chooseGameModeView, 900, 600);

        chooseTTT.setOnAction(e -> {
            window.setScene(chooseGameModeViewScene);
            window.setTitle("Tic Tac Toe");
        });

        back.setOnAction(e -> {
            System.out.println("Moet terug naar MainView");
        });

        getChildren().addAll(chooseGameTitle, chooseTTT, reversi, back);
    }
}

В GameView у меня есть кнопка «Назад», которая должна вернуть вас в MainView. Я действительно не знаю, как это сделать? Я пробовал что-то вроде

MainView mainView = new MainView(window);
        Scene scene = new Scene(mainView)

        back.setOnAction(e -> {
            window.setScene(scene);
        });

Но это не работает и вылетает программа. Как я могу решить это?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...