Хранить динамический экран с несколькими этапами

У меня есть 2 разных экрана, на первом экране пользователь может загружать изображения, а на другом - просто одна кнопка (сцена невидима, поэтому сцена должна отличаться от экрана 1), используемая для возврата к первому этапу., Проблема в том, что я не знаю, как сохранить загруженные изображения, когда я возвращаюсь с экрана 2 на экран 1 (я скрываю этап 1, когда переходю к этапу 2) . Это мой текущий метод на обоих экранах.

    @FXML
private void goToScreen1(ActionEvent event) throws Exception{


        Stage stage = (Stage) showStage.getScene().getWindow();
        FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("/sample.fxml"));
        Parent root = fxmlLoader.load();

        Stage primaryStage = new Stage();

        primaryStage.setResizable(true);
        primaryStage.setOpacity(0.0);
        primaryStage.show();

        primaryStage.setX(0);
        primaryStage.setY(0);
        primaryStage.setHeight(primScreenBounds.getHeight());
        primaryStage.setWidth(primScreenBounds.getWidth() / 2);
}

2 ответа

Решение

Вы должны хранить ссылку на ваш сценический контент, поэтому вам не нужно повторно создавать его. Одна возможность состоит в том, чтобы сохранить его в mainController и предоставить EventHandler вашему субконтроллеру, чтобы переключить сцену

public interface ScreenController {
        void setOnSwitchStage(EventHandler<ActionEvent> handler);
}

public class Screen1Controller implements Initializable, ScreenController {

    @FXML
    private Button btnSwitchScreen

    public Screen1Controller() {
    }

    @Override
    public void initialize(URL location, ResourceBundle resources) {
    }

     @Override
    public void setOnSwitchStage(EventHandler<ActionEvent> handler) {
        btnSwitchScreen.setOnAction(handler);
    }
}

public class YourApp extends Application {

    @Override
    public void start(Stage primaryStage) throws Exception {
        Stage secondaryStage = new Stage();

        initScreen(primaryStage, secondaryStage, "screen1.fxml");
        initScreen(secondaryStage, primaryStage, "screen2.fxml");

        primaryStage.show();
    }

    private void initScreen(Stage parentStage, Stage nextStage, String resource) throws IOException {
    FXMLLoader loader = new FXMLLoader(getClass().getResource(resource));
    Scene scene = new Scene(loader.load());
    parentStage.setScene(scene);

    ScreenController screenController = loader.getController();
    screenController.setOnSwitchStage(evt -> {
        nextStage.show();
        parentStage.hide();
    });
}

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

Если primaryStage где "пользователь может загружать изображения" делать:

static Stage primaryStage;

@FXML
private void goToScreen1(ActionEvent event) throws Exception{


    Stage stage = (Stage) showStage.getScene().getWindow();
    FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("/sample.fxml"));
    Parent root = fxmlLoader.load();

    if(primaryStage==null)
    primaryStage = new Stage();

    primaryStage.setResizable(true);
    primaryStage.setOpacity(0.0);
    primaryStage.show();

    primaryStage.setX(0);
    primaryStage.setY(0);
    primaryStage.setHeight(primScreenBounds.getHeight());
    primaryStage.setWidth(primScreenBounds.getWidth() / 2);

}

Другие вопросы по тегам