显示警报消息时,Javafx全屏应用程序将最小化

时间:2016-01-15 13:57:41

标签: java javafx

我正在创建一个全屏模式的javafx应用程序。当我尝试显示警告消息时,我的应用程序被最小化

Alert alert = new Alert(AlertType.INFORMATION);
alert.setTitle(null);
alert.setHeaderText(null);
alert.setContentText("I have a great message for you!");
alert.show();

当我点击提示上的确定按钮时Box应用程序切换回全屏模式。如何在不降低应用程序的情况下全屏显示提示框消息。

2 个答案:

答案 0 :(得分:9)

将警报的所有者窗口初始化为全屏阶段。

alert.initOwner(primaryStage)

答案 1 :(得分:1)

我不确定为什么显示警报(即Dialog)结束全屏模式。我认为这是因为对话框本身是一个获得焦点的本机窗口。来自JavaFX API文档(类Stage):

  

如果全屏舞台失去焦点或另一个舞台在同一个屏幕上进入全屏模式,则将退出全屏模式(并且fullScreen属性将设置为false)。请注意,全屏模式下的舞台可以在不丢失其全屏状态的情况下变为不可见,并在舞台变为可见时再次进入全屏模式。

鉴于这是一个合理的理由,我试图交换舞台场景获得相同的结果。可能更换场景会影响重新计算舞台(即窗口)的大小。接下来的尝试是交换场景的根,这似乎工作。缺点是您丢失了警报的舒适返回值。

public class FullScreenAlert extends Application {
    @Override
    public void start(Stage primaryStage) throws Exception {
        Pane rootPane = new StackPane();
        Scene mainScene = new Scene(rootPane);
        Button btn = new Button("alert");
        rootPane.getChildren().add(btn);

        Rectangle blockingRect = new Rectangle();
        blockingRect.widthProperty().bind(primaryStage.widthProperty());
        blockingRect.heightProperty().bind(primaryStage.heightProperty());
        blockingRect.setFill(Color.LIGHTBLUE);
        blockingRect.setOpacity(0.5);

        VBox alertPane = new VBox(10);
        alertPane.setBackground(new Background(new BackgroundFill(Color.GRAY, CornerRadii.EMPTY, Insets.EMPTY)));
        alertPane.setMaxWidth(400);
        alertPane.setMaxHeight(200);
        alertPane.setAlignment(Pos.CENTER);
        Label alertMessage = new Label("alert message");
        Button alertOKButton = new Button("OK");
        alertPane.getChildren().addAll(alertMessage, alertOKButton);

        btn.setOnAction(event -> {
            rootPane.getChildren().addAll(blockingRect, alertPane);
        });
        alertOKButton.setOnAction(event -> {
            rootPane.getChildren().removeAll(blockingRect, alertPane);
        });

        primaryStage.setFullScreen(true);
        primaryStage.setScene(mainScene);
        primaryStage.show();
    }

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

因此,结论是您可以在不触及窗口大小的情况下修改当前场景内容,因此不会丢失全屏模式。这样就应该可以绘制一个漂亮的伪对话框,而不是上面的那个。

我知道这肯定不是最好的解决方案,因为整个应用程序只有一个场景。但我不知道保持全屏模式的更好方法。