Zapp Scierwx
Zapp Scierwx

Reputation: 3

Switching scenes in JavaFX with ActionEvent

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
}

Upvotes: 0

Views: 1227

Answers (1)

James_D
James_D

Reputation: 209339

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

Upvotes: 2

Related Questions