首页 文章

使用ActionEvent在JavaFX中切换场景

提问于
浏览
0

你好我有一个几乎没有控制器的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
}

1 回答

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

相关问题