当前位置: 首页 > 知识库问答 >
问题:

JavaFX SetOnCloseRequest() 关闭所有屏幕

应和光
2023-03-14

在我的应用程序中,我有多个.fxml文件。当我在应用程序中设置屏幕时,我还设置了<code>SetOnCloseRequest()管理银行屏幕后不久,应用程序并没有停止运行。所以在那之后我什么都做不了,因为我没有GUI。是否有人知道如何确保管理银行屏幕不会关闭?

下面是我的带有< code>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!!!");
        }
    }
}

共有1个答案

蔺德曜
2023-03-14

试试这个

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

...

primaryStage.setOnCloseRequest(event -> {
    event.consume();
    mainContainer.getManageBanksController().logoutAdmin();
});
 类似资料:
  • 关闭屏幕盖时   设定关闭屏幕盖时的动作。 标准 关闭屏幕盖时,显示专用的画面。 进入睡眠模式 让主机进入睡眠模式。 提示 若主机处于锁定状态(POWER(电源)/HOLD(固定)按钮滑至下方),即使已选择[进入睡眠模式],主机仍不会在关闭屏幕盖时进入睡眠模式。 屏幕盖关闭时显示的画面 在屏幕盖关闭时按下L/R按钮,即可变更显示的内容。 同时按下L/R按钮 每次同时按下L/R按钮,可交替显示月历/

  • 我正在使用AccessibilityService OnKeyEvent捕获HeadSetHook。这是这样的,我可以触发一个事件上键,下键,即使我的应用程序它不在焦点。 但是,一旦屏幕熄灭,它就不起作用了。这有什么办法吗?

  • 首先,我阅读了几十个SO问题,并阅读了Alex Lockwood撰写的关于与片段事务相关的问题的精彩文章:https://www.androiddesignpatterns.com/2013/08/fragment-transaction-commit-state-loss.html-tl;DR我做了功课 但我在任何地方都没有发现问题,此时屏幕关闭,并且我们正在尝试提交片段事务-在我的例子中显示。

  • 我需要一些关于log4j2配置的帮助。当我调试记录器时,它看起来像是关闭了所有的附加程序,然后我从来没有收到任何应用程序日志。幸运的是,我知道log4j至少是找到属性文件,并给记录器初始化调试输出。 这是我的日志4J2。属性文件: 以下是记录器调试初始化输出: 感谢任何帮助!我需要它。 我真的很想让异步appender在某个时候工作,但是很难通过log4j2找到示例。log4j2的属性语法 还有-

  • 问题内容: 我正在制作网络爬虫。我将网址传递给搜寻器函数,并对其进行解析以获取锚标记中的所有链接,然后为所有这些网址使用相同的搜寻器函数,并对每个网址使用单独的goroutine。 但是,如果在我收到响应之前发送请求并取消它,则该特定请求的所有程序仍在运行。 现在我想要的是,当我取消请求时,由于该请求而被调用的所有goroutine都会停止。 请指导。 以下是我的 搜寻器 功能代码。 以下是我的P

  • 我想管理日志旋转在我的服务器上使用logRotate,但是Tomcat执行自己的日志旋转,与logRotate交互不良,我找不到关闭它的方法。我的Tomcat实例目前生成5种类型的日志: catalina.2018-01-17.log mysite_access.2018-01-17.log localhost2018-01-17.log host-manager.2018-01-17.log m