java - 全屏应用程序中的警报问题

标签 java javafx

我正在尝试在全屏 JavaFX 应用程序中在另一个警报之上显示一个警报。如果没有全屏,它可以正常工作,第二个警报显示在第一个警报的顶部。然而,在全屏模式下,第二个警报显示在第一个警报下方,尽管焦点如第一个屏幕截图所示。是否可以将第二个警报显示在顶部?

enter image description here

另外,关于全屏警报的另一个问题是,当转到 Windows 中的桌面或 alt+tab 时,尽管将父阶段设置为所有者,如第二个屏幕截图所示(由于某种原因仅显示第一个警报),但仍会显示警报)。是否可以将警报绑定(bind)到全屏父舞台,这样当父舞台不显示时警报就不会显示?

enter image description here

示例应用程序:

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Alert;
import javafx.scene.control.Button;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

public class Main extends Application {

    public static void run(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage stage) {
        Button button1 = new Button("CREATE 2 ALERTS");
        button1.setOnAction(event -> {
            createAlert("First alert", stage, 300, 300);
            createAlert("Second alert", stage, 500, 100);
        });

        StackPane root = new StackPane(button1);
        Scene scene = new Scene(root);
        stage.setScene(scene);
        stage.setFullScreen(true);
        stage.show();
    }

    private void createAlert(String text, Stage parentStage, int width, int height) {
        Alert alert = new Alert(Alert.AlertType.INFORMATION);
        alert.setHeaderText("");
        alert.setContentText(text);
        alert.initOwner(parentStage);
        alert.getDialogPane().setPrefWidth(width);
        alert.getDialogPane().setPrefHeight(height);
        alert.show();
    }
}

已使用两台 Windows 10 v10.0 计算机重现该问题,其中包含 java v1.8.0_161 javafx v8.0.161 和 java v16.0.1 javafx v16

最佳答案

在警报阶段尝试alwaysOnTop属性后,似乎存在某种错误,即使该属性正确为假,也会强制第一个警报始终位于顶部。这导致了问题中的两个问题。

解决这两个问题的解决方法:

stageAlert1.setAlwaysOnTop(true);
stageAlert1.setAlwaysOnTop(false);
stageAlert2.toFront();

已修复示例应用:

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Alert;
import javafx.scene.control.Button;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

public class Main extends Application {

    public static void run(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage stage) {
        Button button1 = new Button("CREATE 2 ALERTS");
        button1.setOnAction(event -> {
            Alert alert1 = createAlert("First alert", stage, 300, 300);
            Alert alert2 = createAlert("Second alert", stage, 500, 100);
            Stage stageAlert1 = (Stage)alert1.getDialogPane().getScene().getWindow();
            Stage stageAlert2 = (Stage)alert2.getDialogPane().getScene().getWindow();
            stageAlert1.setAlwaysOnTop(true);
            stageAlert1.setAlwaysOnTop(false);
            stageAlert2.toFront();
        });
        StackPane root = new StackPane(button1);
        Scene scene = new Scene(root);
        stage.setScene(scene);
        stage.setFullScreen(true);
        stage.show();
    }

    private Alert createAlert(String text, Stage parentStage, int width, int height) {
        Alert alert = new Alert(Alert.AlertType.INFORMATION);
        alert.setHeaderText("");
        alert.setContentText(text);
        alert.initOwner(parentStage);
        alert.getDialogPane().setPrefWidth(width);
        alert.getDialogPane().setPrefHeight(height);
        alert.show();
        return alert;
    }
}

关于java - 全屏应用程序中的警报问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68860913/

相关文章:

java - C# 等效于 LinkedHashMap

java - 通用对象的 HashCode 实现

javafx-2 - 在 Java FX 中扩展类?

java - Eclipse Neon (MAC) 中的 MySQL 出现错误 "org.eclipse.jface"

java - Struts<逻辑:notEmpty> not working or bean property not being written properly to JSP?

java - 从webtable中获取值并循环写入excel表中的每一行

java - 对象上的线程锁是否也确保成员对象上的锁?

java - JavaFX TextField 中是否有多个插入符?

java - 是否可以将 JavaFX 的 WebView 更改为 Chrome

Java 将子列表绑定(bind)到主列表