你好,我有一个JavaFX应用程序,有几个控制器,我有2个选项来返回到上一个屏幕。用户可以点击“离开”按钮,或者在完成该屏幕上的一些任务后,将自动移至上一页。我在这里遇到了问题,因为我已经创建了没有fxml注释的方法,该方法将ActionEvent对象作为参数,当用户单击按钮时调用,当用户将完成任务时调用,并且应该自动移动到上一个屏幕。我不能调用该方法,因为我没有该对象,在这种情况下,它是在进行操作单击时创建的。我如何让这两种“退出”选项都成为可能?
所以这是我的方法,它用于我的按钮“onAction”:
@FXML
private void leaveRoomAction(ActionEvent event) {
try {
removePlayerFromRoom();
FXMLLoader loader = new FXMLLoader();
loader.setLocation(getClass().getResource("LobbyView.fxml"));
Parent root = (Parent) loader.load();
LobbyController lobbyController = (LobbyController)loader.getController();
lobbyController.setClientThread(client);
lobbyController.setNameAndBalance(client.getPlayer().getName());
Scene scene = new Scene(root);
Stage stage = (Stage) ((Node) event.getSource()).getScene().getWindow();
stage.setScene(scene);
stage.show();
} catch (IOException e) {
e.printStackTrace();
}
}
稍后在节目的其他部分:
if(isFinished()){
//here I want write leaving this screen and getting back to previous
}
首先,找到另一种方法来获取对舞台
的引用。由于您几乎可以肯定在控制器中引用了场景中的某个节点,因此您可以替换
Stage stage = (Stage) ((Node) event.getSource()).getScene().getWindow();
具有
Stage stage = (Stage) anyNode.getScene().getWindow();
其中anyNode
只是您已经注入到控制器中的东西。
现在您根本不需要该参数,因此您可以将其删除。即你最终得到
@FXML
private Node anyNode ; // probably a more specific type than Node.
@FXML
private void leaveRoomAction() {
try {
removePlayerFromRoom();
FXMLLoader loader = new FXMLLoader();
loader.setLocation(getClass().getResource("LobbyView.fxml"));
Parent root = (Parent) loader.load();
LobbyController lobbyController = (LobbyController)loader.getController();
lobbyController.setClientThread(client);
lobbyController.setNameAndBalance(client.getPlayer().getName());
Scene scene = new Scene(root);
Stage stage = anyNode.getScene().getWindow();
stage.setScene(scene);
stage.show();
} catch (IOException e) {
e.printStackTrace();
}
}
现在你可以调用这个方法:
if ( isFinished() ) {
leaveRoomAction()
}