java - 如何在初始化期间正确显示警报?
问题描述
在我initialize()
的控制器方法中,MyController
我使用 SQL 查询来初始化组合框的值。但是当例如用户不在线时,我会收到一个错误,然后我想显示一个Alert
.
但问题是,如果我在initialize()
方法中这样做,首先会显示 Alert,然后是初始化的 fxml myfxml
,所以 Alert 被它隐藏了。我猜原因是,在该initialize()
方法期间,myfxml
还Stage
没有,因为它仍在初始化,所以我的警报显示在另一个阶段。
但是,解决这个问题的推荐方法是什么,并将初始化方法显示为父级的警报?我发现的一种方法是将异常保存在 中MyController
,创建一个 getter 并调用如下方法:
MyController myCon = ((MyController)fxmlLoader.getController());
SQLException e = myCon.getInitializeException();
new Alert(Alert.AlertType.WARNING, e.getMessage());
但是由于myfxml
在MenuController
的初始化方法中被初始化,我需要再次重复代码,这会弄乱我的代码。
那么有没有一种干净的方法来解决我的问题?
先感谢您 :)!
解决方案
尝试Platform.runLater(...)
在您的初始化方法中使用。平台线程将在您的窗口完全初始化并显示后执行代码。您应该能够使用任何控件通过cntrl.getScene().getWindow()
. 这可以传递给Alert.initOwner(...)
.
顺便说一句,您不应该从 JavaFX 平台线程运行 SQL 查询。这将使您的应用程序不响应任何类型的用户输入。例如,当用户移动它时,您的窗口将无法正确绘制。确保您从不同的线程中访问数据库。您可以使用Excecutors
andExecutorService
或普通的Thread
. 用于Platform.runLater(...)
将结果传递到前端并相应地更新您的 UI 控件。