我正在尝试在全屏 JavaFX 应用程序中在另一个警报之上显示一个警报。如果没有全屏,它可以正常工作,第二个警报显示在第一个警报的顶部。然而,在全屏模式下,第二个警报显示在第一个警报下方,尽管焦点如第一个屏幕截图所示。是否可以将第二个警报显示在顶部?
另外,关于全屏警报的另一个问题是,当转到 Windows 中的桌面或 alt+tab 时,尽管将父阶段设置为所有者,如第二个屏幕截图所示(由于某种原因仅显示第一个警报),但仍会显示警报)。是否可以将警报绑定(bind)到全屏父舞台,这样当父舞台不显示时警报就不会显示?
示例应用程序:
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/