Svenmarim
Svenmarim

Reputation: 3735

JavaFX SetOnCloseRequest() closing all screens

In my application I have multiple .fxml files. When I set a screen in my application, I also set the SetOnCloseRequest() method. For some screens is the code in that method just to switch to another screen. For example: When I have my Create Bank screen open and I press the close button, I want to switch back to my Manage Banks screen. But when I press the close button, it seems to switch the screens correctly, but very shortly after it closes the Manage Banks screen for some reason and the application dont stops running. So I cant do anything after that, because I don't have any GUI. Does someone knows how to make sure that the Manage Banks screens does not close?

Here is my main class with theSetOnCloseRequest() method:

public class ClientMain extends Application {
    public static String screenCreateBankId = "createBank";
    public static String screenCreateBankFile = "Screens/createBank.fxml";
    public static String screenCreateBankAccountId = "createBankAccount";
    public static String screenCreateBankAccountFile = "Screens/createBankAccount.fxml";
    public static String screenLoginId = "login";
    public static String screenLoginFile = "Screens/login.fxml";
    public static String screenManageBanksId = "manageBanks";
    public static String screenManageBanksFile = "Screens/manageBanks.fxml";
    private static Stage primaryStage;
    private static ScreensController mainContainer;

    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage primaryStage) {
        ClientMain.primaryStage = primaryStage;

        mainContainer = new ScreensController();
        mainContainer.loadScreen(ClientMain.screenCreateBankId, ClientMain.screenCreateBankFile);
        mainContainer.loadScreen(ClientMain.screenLoginId, ClientMain.screenLoginFile);
        mainContainer.loadScreen(ClientMain.screenManageBanksId, ClientMain.screenManageBanksFile);

        mainContainer.setScreen(ClientMain.screenLoginId);

        Group root = new Group();
        root.getChildren().addAll(mainContainer);
        primaryStage.setResizable(false);
        primaryStage.getIcons().add(new Image("file:assets/ideal_logo.jpg"));
        primaryStage.setScene(new Scene(root));
        primaryStage.show();
    }

    public static void setProperties(String name){
        primaryStage.sizeToScene();
        primaryStage.centerOnScreen();
        switch (name){   
            case "createBank":
                primaryStage.setTitle("Create Bank");
                primaryStage.setOnCloseRequest(event -> mainContainer.setScreen(screenManageBanksId));
                break;
            case "login":
                primaryStage.setTitle("Login");
                primaryStage.setOnCloseRequest(event -> System.exit(0));
                break;
            case "manageBanks":
                primaryStage.setTitle("Manage Banks");
                primaryStage.setOnCloseRequest(event -> mainContainer.getManageBanksController().logoutAdmin());
                break;
        }
    }
}

And here is my ScreensController class:

public class ScreensController extends StackPane {

    private HashMap<String, Node> screens = new HashMap<>();
    private Client client;
    private NewTransactionController newTransactionController;
    private BankAccountController bankAccountController;
    private ManageBanksController manageBanksController;

    public Client getClient() {
        return this.client;
    }

    public NewTransactionController getNewTransactionController() {
        return this.newTransactionController;
    }

    public BankAccountController getBankAccountController() {
        return this.bankAccountController;
    }

    public ManageBanksController getManageBanksController() {
        return this.manageBanksController;
    }

    public ScreensController() {
        try {
            this.client = new Client();
            System.out.println("Client: Client created");
        } catch (RemoteException e) {
            System.out.println("Client: Cannot create Client");
            System.out.println("Client: RemoteException: " + e.getMessage());
            System.exit(0);
        }
    }

    public void addScreen(String name, Node screen) {
        screens.put(name, screen);
    }

    public void loadScreen(String name, String resource) {
        try {
            FXMLLoader myLoader = new FXMLLoader(getClass().getResource(resource));
            Parent loadScreen = myLoader.load();
            IControllers myScreenController = myLoader.getController();
            if (myScreenController instanceof NewTransactionController) {
                this.newTransactionController = (NewTransactionController) myScreenController;
            } else if (myScreenController instanceof BankAccountController) {
                this.bankAccountController = (BankAccountController) myScreenController;
            } else if (myScreenController instanceof ManageBanksController) {
                this.manageBanksController = (ManageBanksController) myScreenController;
            }
            myScreenController.setScreenParent(this);
            addScreen(name, loadScreen);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void setScreen(final String name) {
        if (screens.get(name) != null) {
            if (!getChildren().isEmpty()) {
                getChildren().remove(0);
                getChildren().add(0, screens.get(name));
                ClientMain.setProperties(name);
            } else {
                //First time start up
                getChildren().add(screens.get(name));
                ClientMain.setProperties(name);
            }
        } else {
            System.out.println("Screen hasn't been loaded!!!");
        }
    }
}

Upvotes: 1

Views: 878

Answers (1)

mr mcwolf
mr mcwolf

Reputation: 2859

try this

primaryStage.setOnCloseRequest(event -> {
    event.consume();
    mainContainer.setScreen(screenManageBanksId);
});

...

primaryStage.setOnCloseRequest(event -> {
    event.consume();
    mainContainer.getManageBanksController().logoutAdmin();
});

Upvotes: 1

Related Questions