存储多个阶段的动态屏幕

时间:2016-04-12 23:15:22

标签: image javafx screen stage

我有两个不同的屏幕,在第一个屏幕中,用户可以加载图像,另一个只是一个按钮(舞台是隐形的,所以舞台必须与屏幕1不同)用于返回第一阶段。问题是当我从屏幕2返回到屏幕1时,我不知道如何保持图像加载(当我进入第2阶段时,我隐藏了第1阶段)。这是我在两个屏幕中的当前方法。

    @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 个答案:

答案 0 :(得分:1)

您必须存储对舞台内容的引用,因此您不必重新实例化它。 一种可能性是将它存储在mainController中,并为您的subController提供一个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);
    }
}

答案 1 :(得分:0)

如果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);

}