使用ActionEvent在JavaFX中切换场景
您好,我有一个JavaFX应用程序,几乎没有控制器,我有两个选项可以返回到上一个屏幕。用户可以单击“离开”按钮,或者在完成此屏幕上的某些任务后,将自动移动到上一个屏幕。我在这里遇到了问题,因为我创建了带有fxml注释的方法,该方法以ActionEvent对象为参数,当用户单击按钮时调用,当用户将完成任务时调用,并应自动移动到上一个屏幕。我无法调用此方法,因为我不知道此对象,它是在执行操作时创建的。在这种情况下,单击。如何使两个“退出”选项都成为可能 下面是我的方法,用于“onAction”按钮:使用ActionEvent在JavaFX中切换场景,javafx,scene,stage,Javafx,Scene,Stage,您好,我有一个JavaFX应用程序,几乎没有控制器,我有两个选项可以返回到上一个屏幕。用户可以单击“离开”按钮,或者在完成此屏幕上的某些任务后,将自动移动到上一个屏幕。我在这里遇到了问题,因为我创建了带有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();
与
其中,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()
}
首先,找到另一种方法来获取对阶段的引用。由于几乎可以肯定控制器中存在对场景中某个节点的引用,因此可以替换
Stage stage = (Stage) ((Node) event.getSource()).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()
}
可能的重复可能的重复