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 在屏幕中心打开,如警报对话框

如果前面没有警报,我的 jQuery UI 对话框不会打开

如何在脚本中使用对话框制作警报 onclick 功能以将警报容器重用于其他对话框

在android中调整警报对话框的大小

使用 jquery 警报对话框插件,如何将表单中的值发送到回调功能?表格在警报中