首页 > 解决方案 > 如何在初始化期间正确显示警报?

问题描述

在我initialize()的控制器方法中,MyController我使用 SQL 查询来初始化组合框的值。但是当例如用户不在线时,我会收到一个错误,然后我想显示一个Alert.

但问题是,如果我在initialize()方法中这样做,首先会显示 Alert,然后是初始化的 fxml myfxml,所以 Alert 被它隐藏了。我猜原因是,在该initialize()方法期间,myfxmlStage没有,因为它仍在初始化,所以我的警报显示在另一个阶段。

但是,解决这个问题的推荐方法是什么,并将初始化方法显示为父级的警报?我发现的一种方法是将异常保存在 中MyController,创建一个 getter 并调用如下方法:

MyController myCon = ((MyController)fxmlLoader.getController());
SQLException e = myCon.getInitializeException();
new Alert(Alert.AlertType.WARNING, e.getMessage());

但是由于myfxmlMenuController的初始化方法中被初始化,我需要再次重复代码,这会弄乱我的代码。

那么有没有一种干净的方法来解决我的问题?

先感谢您 :)!

标签: javajavafx

解决方案


尝试Platform.runLater(...)在您的初始化方法中使用。平台线程将在您的窗口完全初始化并显示后执行代码。您应该能够使用任何控件通过cntrl.getScene().getWindow(). 这可以传递给Alert.initOwner(...).

顺便说一句,您不应该从 JavaFX 平台线程运行 SQL 查询。这将使您的应用程序不响应任何类型的用户输入。例如,当用户移动它时,您的窗口将无法正确绘制。确保您从不同的线程中访问数据库。您可以使用ExcecutorsandExecutorService或普通的Thread. 用于Platform.runLater(...)将结果传递到前端并相应地更新您的 UI 控件。


推荐阅读