提问者:小点点

使用ActionEvent在JavaFX中切换场景


你好,我有一个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
}

共1个答案

匿名用户

首先,找到另一种方法来获取对舞台的引用。由于您几乎可以肯定在控制器中引用了场景中的某个节点,因此您可以替换

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()
}