使用ActionEvent在JavaFX中切换场景

使用ActionEvent在JavaFX中切换场景,javafx,scene,stage,Javafx,Scene,Stage,您好,我有一个JavaFX应用程序,几乎没有控制器,我有两个选项可以返回到上一个屏幕。用户可以单击“离开”按钮,或者在完成此屏幕上的某些任务后,将自动移动到上一个屏幕。我在这里遇到了问题,因为我创建了带有fxml注释的方法,该方法以ActionEvent对象为参数,当用户单击按钮时调用,当用户将完成任务时调用,并应自动移动到上一个屏幕。我无法调用此方法,因为我不知道此对象,它是在执行操作时创建的。在这种情况下,单击。如何使两个“退出”选项都成为可能 下面是我的方法,用于“onAction”按钮:

您好,我有一个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()
}
可能的重复可能的重复