JavaFX SetOnCloseRequest()关闭所有屏幕

JavaFX SetOnCloseRequest()关闭所有屏幕,java,javafx,Java,Javafx,在我的应用程序中,我有多个.fxml文件。在应用程序中设置屏幕时,我还设置了SetOnCloseRequest()方法。对于某些屏幕,该方法中的代码只是切换到另一个屏幕。例如:当我打开我的创建银行屏幕并按下关闭按钮时,我想切换回我的管理银行屏幕。但当我按下关闭按钮时,它似乎正确地切换了屏幕,但由于某种原因,在关闭管理银行屏幕后不久,应用程序不会停止运行。所以在那之后我什么都做不了,因为我没有GUI。 有人知道如何确保管理银行屏幕不关闭吗 下面是我使用SetOnCloseRequest()方法的主

在我的应用程序中,我有多个.fxml文件。在应用程序中设置屏幕时,我还设置了
SetOnCloseRequest()
方法。对于某些屏幕,该方法中的代码只是切换到另一个屏幕。例如:当我打开我的
创建银行
屏幕并按下关闭按钮时,我想切换回我的
管理银行
屏幕。但当我按下关闭按钮时,它似乎正确地切换了屏幕,但由于某种原因,在关闭
管理银行
屏幕后不久,应用程序不会停止运行。所以在那之后我什么都做不了,因为我没有GUI。 有人知道如何确保
管理银行
屏幕不关闭吗

下面是我使用
SetOnCloseRequest()
方法的主类:

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;
        }
    }
}
这是我的
ScreensController
类:

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!!!");
        }
    }
}
公共类屏幕控制器扩展StackPane{
私有HashMap screens=newhashmap();
私人客户;
专用新交易控制器新交易控制器;
私人银行账户控制人银行账户控制人;
私人管理银行控制器管理银行控制器;
公共客户端getClient(){
将此文件退还给客户;
}
公共NewTransactionController getNewTransactionController(){
返回此.newTransactionController;
}
公共BankAccountController getBankAccountController(){
返回此.bankAccountController;
}
public ManageBanksController getManageBanksController(){
返回此.manageBanksController;
}
公共屏幕控制器(){
试一试{
this.client=新客户端();
System.out.println(“客户机:创建的客户机”);
}捕获(远程异常){
System.out.println(“客户端:无法创建客户端”);
System.out.println(“客户端:RemoteException:+e.getMessage());
系统出口(0);
}
}
公共void addScreen(字符串名称、节点屏幕){
屏幕。put(名称、屏幕);
}
公共void加载屏幕(字符串名称、字符串资源){
试一试{
FXMLLoader myLoader=新的FXMLLoader(getClass().getResource(resource));
父loadScreen=myLoader.load();
IControllers myScreenController=myLoader.getController();
if(新TransactionController的myScreenController实例){
this.newTransactionController=(newTransactionController)myScreenController;
}else if(BankAccountController的myScreenController实例){
this.bankAccountController=(bankAccountController)myScreenController;
}else if(myScreenController实例of manageBanks控制器){
this.manageBanksController=(manageBanksController)myScreenController;
}
myScreenController.setScreenParent(此);
addScreen(名称、加载屏幕);
}捕获(例外e){
e、 printStackTrace();
}
}
公共无效设置屏幕(最终字符串名称){
if(screens.get(name)!=null){
如果(!getChildren().isEmpty()){
getChildren().remove(0);
getChildren().add(0,screens.get(name));
setProperties(名称);
}否则{
//首次启动
getChildren().add(screens.get(name));
setProperties(名称);
}
}否则{
System.out.println(“屏幕尚未加载!!!”;
}
}
}
试试这个

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

...

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