Хранить динамический экран с несколькими этапами
У меня есть 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);
}