0

Hello I am having an JavaFX app with few controllers and I have 2 options to get back to previous screen. User can click button 'leave' or after finishing some tasks on this screen will be moved to previous automatically. I have problem here because I've created method wiut fxml annotation which takes ActionEvent object as parameter and is called when user click button and when user will finish tasks and should be moved automatically to previous screen I cannot call this method because I dont this object, it's created when an action - click in this case is made. How can I make it possible for both 'exit' options?

So here is my method which is used 'onAction' for my button:

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

And later in other part of programe:

if(isFinished()){
//here I want write leaving this screen and getting back to previous
}
  • Possible duplicate of [How to swap screens in a javafx-application in the controller-class?](https://stackoverflow.com/questions/12804664/how-to-swap-screens-in-a-javafx-application-in-the-controller-class) – TM00 Feb 06 '18 at 10:22

1 Answers1

2

First, find another way to get a reference to the Stage. Since you almost certainly have a reference to some node in the scene in your controller, you can replace

Stage stage = (Stage) ((Node) event.getSource()).getScene().getWindow();

with

Stage stage = (Stage) anyNode.getScene().getWindow();

where anyNode is just something you have injected into the controller.

Now you don't need the parameter at all, so you can just remove it. I.e. you end up with

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

And now you can just call the method:

if ( isFinished() ) {
    leaveRoomAction()
}
James_D
  • 201,275
  • 16
  • 291
  • 322