【问题标题】:Redirecting to another window on close关闭时重定向到另一个窗口
【发布时间】:2018-08-17 10:10:06
【问题描述】:

我有成功登录后调用的用户窗口。用户阶段由 LoginController 类中的以下代码调用。

public void login(ActionEvent event) {
    try {
        if (loginModel.isLoggedIn(txtLogin.getText(), txtPassField.getText())) {
            lblDBStatus.setText("Username and password are correct");

            String fxmlFile = "/fxml/User.fxml";
            LOG.debug("Loading FXML for User view from: {}", fxmlFile);

            LOG.info("Hiding login page");
            ((Node) event.getSource()).getScene().getWindow().hide();


            Stage stage = new Stage();
            FXMLLoader loader = new FXMLLoader();
            Pane rootNode = loader.load(getClass().getResource(fxmlFile).openStream());
            UserController userController = (UserController) loader.getController();
            userController.getUserName(txtLogin.getText());

            LOG.info("Showing User page");
            Scene scene = new Scene(rootNode);
            scene.getStylesheets().add("/styles/user-controller.css");

            stage.setTitle("WindOptimizer");
            stage.setScene(scene);
            stage.show();


        } else {
            lblDBStatus.setText("Username and password are incorrect");

        }
    } catch (SQLException | IOException e) {
        e.printStackTrace();
    }
}

现在我有另一个事件处理程序,它正在从 UserController 重定向我,它正在创建 Turbines 窗口。

public void openTurbinesTab(ActionEvent event) {

    try {
        String fxmlFile = "/fxml/WindTurbines.fxml";
        LOG.debug("Loading FXML for Turbines view from: {}", fxmlFile);

        LOG.info("Hiding user page");
        ((Node) event.getSource()).getScene().getWindow().hide();


        Stage stage = new Stage();
        FXMLLoader loader = new FXMLLoader();
        Pane rootNode = loader.load(getClass().getResource(fxmlFile).openStream());
        TurbinesController turbinesController = (TurbinesController) loader.getController();
        turbinesController.getStationName(stationCB.getValue().toString());

        LOG.info("Showing Turbines page");
        Scene scene = new Scene(rootNode);
        scene.getStylesheets().add("/styles/turbines-controller.css");

        stage.setTitle("WindOptimizer");
        stage.setScene(scene);
        stage.show();

        stage.setOnCloseRequest((WindowEvent event1) -> {


        });

    } catch (IOException e) {
        e.printStackTrace();
    }


}

在涡轮机窗口中执行一些操作后,我想保存这些数据(就像 getUserName 或 getStationName 一样)并在关闭涡轮机选项卡后重定向回用户窗口。如您所见,我很确定我应该使用stage.setOnCloseRequest((WindowEvent event1),但不幸的是,我不知道在此方法中应该提供什么才能成功调用回用户窗口。

【问题讨论】:

  • 如果我理解正确,您可以在onCloseRequest 处理程序中调用Window.requestFocus()(或Stage.toFront()?)。您需要引用另一个 Window 来执行此操作。
  • 引用其他窗口是什么意思?程序流程应如下所示:打开用户窗口 -> 单击按钮重定向到涡轮机窗口 -> 关闭用户窗口并打开涡轮机窗口 -> 单击涡轮机窗口上的退出按钮 -> 隐藏涡轮机窗口并再次显示用户窗口
  • 我仍然没有找到任何解决方案。也许在后退按钮的形状上创建一些东西或专注于已调用的窗口并且不允许用户在其他窗口上执行任何操作会更容易(类似于在文本编辑器中保存文件 - 你不能执行任何操作之前没有保存或放弃更改)?

标签: java javafx stage


【解决方案1】:

这就是我设法解决问题的方法: 我在 userController 中创建了静态舞台对象:

public static Stage userStage;

并更改了调用用户窗口的登录方法如下:

public void login(ActionEvent event) {
    try {
        if (loginModel.isLoggedIn(txtLogin.getText(), txtPassField.getText())) {
            lblDBStatus.setText("Username and password are correct");

            String fxmlFile = "/fxml/User.fxml";
            LOG.debug("Loading FXML for User view from: {}", fxmlFile);

            LOG.info("Hiding login page");
            ((Node) event.getSource()).getScene().getWindow().hide();


            userStage = new Stage();
            FXMLLoader loader = new FXMLLoader();
            Pane rootNode = loader.load(getClass().getResource(fxmlFile).openStream());
            UserController userController = (UserController) loader.getController();
            userController.getUserName(txtLogin.getText());

            LOG.info("Showing User page");
            Scene scene = new Scene(rootNode);
            scene.getStylesheets().add("/styles/user-controller.css");

            userStage.setTitle("WindOptimizer");
            userStage.setScene(scene);
            userStage.show();


        } else {
            lblDBStatus.setText("Username and password are incorrect");

        }
    } catch (SQLException | IOException e) {
        e.printStackTrace();
    }
}

然后在 userController 中我调用了 openTurbines 选项卡并设置焦点:

public void openTurbinesTab(ActionEvent event) {

    try {
        String fxmlFile = "/fxml/WindTurbines.fxml";
        LOG.debug("Loading FXML for Turbines view from: {}", fxmlFile);

        LOG.info("Hiding user page");

        Stage stage = new Stage();
        FXMLLoader loader = new FXMLLoader();
        Pane rootNode = loader.load(getClass().getResource(fxmlFile).openStream());

        TurbinesController turbinesController = (TurbinesController) loader.getController();
        turbinesController.getStationName(stationCB.getValue().toString());

        LOG.info("Showing Turbines page");
        Scene scene = new Scene(rootNode);
        scene.getStylesheets().add("/styles/turbines-controller.css");

        stage.setTitle("WindOptimizer");
        stage.setScene(scene);
        stage.initOwner(LoginController.userStage);
        stage.initModality(Modality.WINDOW_MODAL);
        stage.showAndWait();

    } catch (IOException e) {
        e.printStackTrace();
    }
}

它的工作原理!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 2011-08-05
    • 2022-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多