Java 关闭时重定向到另一个窗口
我有一个在成功登录后调用的用户窗口。用户阶段由LoginController类中的以下代码调用Java 关闭时重定向到另一个窗口,java,javafx,stage,Java,Javafx,Stage,我有一个在成功登录后调用的用户窗口。用户阶段由LoginController类中的以下代码调用 public void login(ActionEvent event) { try { if (loginModel.isLoggedIn(txtLogin.getText(), txtPassField.getText())) { lblDBStatus.setText("Username and password are correct");
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重定向我,并创建了一个窗口
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();
}
}
在turbines窗口中执行一些操作后,我想保存这些数据(就像getUserName或getStationName),并在关闭turbines选项卡后重定向回用户窗口。正如您所看到的,我非常确定我应该使用
stage.setOnCloseRequest((WindowEvent1)
,但不幸的是,我不知道在这个方法中应该提供什么来成功调用back user window。这就是我解决问题的方法:
我在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();
}
}
它正在工作!如果我理解正确,您可以调用
Window.requestFocus()
(或Stage.toFront()
?)在onCloseRequest
处理程序中。要执行此操作,您需要引用另一个窗口。引用其他窗口是什么意思?程序流程应该如下所示:打开用户窗口->单击按钮重定向到风轮机窗口->关闭用户窗口并打开风轮机窗口->单击风轮机窗口上的退出按钮dow->hide turbines window and show user window againI仍然并没有找到任何解决方案。也许在后退按钮的形状上创建一些东西,或者将焦点放在已调用的窗口上,而不允许用户在其他窗口上执行任何操作会更容易(类似于在文本编辑器中保存文件-在未事先保存或放弃更改的情况下,您无法执行任何操作)?