JavaFX 如何将对话框/警报带到屏幕前面
Posted
技术标签:
【中文标题】JavaFX 如何将对话框/警报带到屏幕前面【英文标题】:JavaFX How to bring Dialog/Alert to the front of the screen 【发布时间】:2016-08-05 23:53:33 【问题描述】:我想强制警报位于其他应用程序之上。警报似乎缺少 setAlwaysOnTop 函数。
我看过这个帖子:JavaFX 2.2 Stage always on top。
我试过了:
-
创建一个新阶段和 stage.setAlwaysOnTop(true),然后是 alert.initOwner(stage)。
创建一个新阶段和 stage.initModality(Modality.APPLICATION_MODAL),然后是 alert.initOwner(stage)。
有谁知道如何做到这一点?
编辑: 我正在使用 Java 8。
假设我已经打开了 safari,并且正在集中注意力。当我调用它的 showAndWait() 函数时,我想将 Alert 带到屏幕顶部,在 safari 前面。
【问题讨论】:
所以使用具有该功能的窗口,并根据您的警报进行自定义 【参考方案1】: Alert alert = new Alert(Alert.AlertType.WARNING, "I Warn You!", ButtonType.OK, ButtonType.CANCEL);
Stage stage = (Stage) alert.getDialogPane().getScene().getWindow();
stage.setAlwaysOnTop(true);
stage.toFront(); // not sure if necessary
【讨论】:
即使没有stage.toFront();
也能正常工作。
谢谢。效果很好!
一开始我没有stage.toFront();它没有用。然后我用 stage.toFront() 进行了尝试,它成功了!非常感谢您提供此解决方案!后来我看到我忘了打电话 alert.initOwner(App.getPrimaryStage());这导致了我的错误。
2020 年,我发现这对于将舞台设置为警报对话框的顶部非常有帮助。【参考方案2】:
您可以从Alert
中“窃取”DialogPane
并将其显示在实用程序Stage
中。对于此窗口,您可以按常规方式设置 alwaysOnTop
属性:
Alert alert = new Alert(Alert.AlertType.WARNING, "I Warn You!", ButtonType.OK, ButtonType.CANCEL);
DialogPane root = alert.getDialogPane();
Stage dialogStage = new Stage(StageStyle.UTILITY);
for (ButtonType buttonType : root.getButtonTypes())
ButtonBase button = (ButtonBase) root.lookupButton(buttonType);
button.setOnAction(evt ->
root.setUserData(buttonType);
dialogStage.close();
);
// replace old scene root with placeholder to allow using root in other Scene
root.getScene().setRoot(new Group());
root.setPadding(new Insets(10, 0, 10, 0));
Scene scene = new Scene(root);
dialogStage.setScene(scene);
dialogStage.initModality(Modality.APPLICATION_MODAL);
dialogStage.setAlwaysOnTop(true);
dialogStage.setResizable(false);
dialogStage.showAndWait();
Optional<ButtonType> result = Optional.ofNullable((ButtonType) root.getUserData());
System.out.println("result: "+result.orElse(null));
【讨论】:
【参考方案3】:我尝试了 f***s 和 claimoars 解决方案并将它们简化为:
((Stage) dialog.getDialogPane().getScene().getWindow()).setAlwaysOnTop(true);
这适用于我的 Eclipse / JavaFX 应用程序。
【讨论】:
【参考方案4】:试试这个
Alert a = new Alert(AlertType.ERROR);
a.setTitle("Title of alert");
a.initStyle(StageStyle.UNDECORATED);
a.setContentText("details of message");
a.showAndWait();
如果发生错误,您可以使用它来强制向用户显示警报消息,例如当用户以字符串形式输入数据并且您以整数形式接受数据时。 希望对你有帮助。
注意: 我认为 Alert 可用于 javafx (jdk 1.8)。
【讨论】:
确保更新 jdk 和 java 工具并导入警报 即使使用更新的 jdk,这也不起作用。当父阶段为 OnTop 时,javafx.scene.control.Alert
不会自动变为 alwaysOnTop
,除非您想办法这样做。以上是关于JavaFX 如何将对话框/警报带到屏幕前面的主要内容,如果未能解决你的问题,请参考以下文章
有时,BottomSheetDialogFragment 在屏幕中心打开,如警报对话框