【问题标题】:JavaFX How to bring Dialog/Alert to the front of the screenJavaFX 如何将对话框/警报带到屏幕前面
【发布时间】:2016-08-05 23:53:33
【问题描述】:

我想强制警报位于其他应用程序之上。警报似乎缺少 setAlwaysOnTop 函数。

我看过这个帖子:JavaFX 2.2 Stage always on top

我试过了:

  1. 创建一个新阶段和 stage.setAlwaysOnTop(true),然后是 alert.initOwner(stage)。
  2. 创建一个新阶段和 stage.initModality(Modality.APPLICATION_MODAL),然后是 alert.initOwner(stage)。

有谁知道如何做到这一点?

编辑: 我正在使用 Java 8。

假设我已经打开了 safari,并且正在集中注意力。当我调用它的 showAndWait() 函数时,我想将 Alert 带到屏幕顶部,在 safari 前面。

【问题讨论】:

  • 所以使用具有该功能的窗口,并根据您的警报进行自定义

标签: java javafx javafx-8


【解决方案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】:

    我尝试了 fabians 和 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,除非您想办法这样做。
      猜你喜欢
      • 2018-10-13
      • 2015-06-26
      • 1970-01-01
      • 1970-01-01
      • 2021-08-23
      • 2011-01-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多