你好我有一个几乎没有控制器的JavaFX应用程序,我有2个选项可以回到上一个屏幕。用户可以单击“离开”按钮,或者在此屏幕上完成某些任务后将自动移至上一个。我有问题,因为我已经创建了方法wiut 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
}
答案 0 :(得分:2)
首先,找到另一种方法来获取对Stage
的引用。由于您几乎肯定会在控制器中引用场景中的某个节点,因此可以替换
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()
}