舞台处于全屏模式时隐藏JavaFX弹出窗口

时间:2014-12-02 20:41:26

标签: popup fullscreen javafx-8

我正在尝试在javafx中的全屏主要舞台上弹出一个对话框。当我创建弹出窗口时,它意外地隐藏在我的全屏主要舞台后面,直到舞台从全屏模式中移除(通过 ESC )。如果我使我的主要舞台最大化和未修饰而不是全屏,那么我的弹出窗口将按预期显示在主舞台的顶部。

我是否遗漏了全屏模式与最大化和未修饰模式的不同之处?我不正确地使用全屏模式吗?

我在CentOS 6.5上使用Java版本1.8.0_20与Gnome。

这是我的SSCCE:

import javafx.application.*;
import javafx.scene.*;
import javafx.scene.control.*;
import javafx.stage.*;

public class TestApplication extends Application {
    private Stage primaryStage;

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

    public void start(Stage stage) {
        this.primaryStage = stage;

        // Create a fullscreen primary stage.    
        primaryStage.setTitle("Main Stage");
        primaryStage.setScene(new Scene(createRoot()));
        primaryStage.setFullScreen(true);

        primaryStage.show();
    }       

    private Parent createRoot() {
        Button button = new Button("Show popup");
        button.setOnAction((event) -> showPopup());

        return button;
    }

    private void showPopup() {
        // Create a popup that should be on top of the primary stage.
        Stage popupStage = new Stage();

        popupStage.setScene(new Scene(createPopupRoot()));
        popupStage.setTitle("Popup Stage");
        popupStage.initModality(Modality.WINDOW_MODAL);
        popupStage.initOwner(primaryStage);

        popupStage.show();
    }

    private Parent createPopupRoot() {
        return new Label("This is a popup!");
    }
}

2 个答案:

答案 0 :(得分:2)

假设您使用的是Mac,这是一个known issue,固定在8u40。您可能需要使用ea版本直到完整版本。

这个错误的基本历史是JavaFX实现了自己的全屏实现,以便支持10.7之前的OS X版本(它没有本机全屏模式)。该实现使用"独占模式",这可以防止其他窗口显示。这可能会变得非常糟糕:例如ComboBox无法工作......使用本机模式在8u40中解决了该问题(因为不再支持10.7之前的OS X版本)。 / p>

请注意,如果您没有以编程方式设置全屏模式,并允许用户使用窗口标题栏上的Mac OS按钮进入全屏模式,则不会出现此问题。

答案 1 :(得分:2)

在使用java版本' 1.8.0_40'重复此问题后,我终于找到了解决此问题的方法!

popupStage.initStyle(StageStyle.UTILITY);

Stage.initStyle(StageStyle) -- JavaFX 8

即使在弹出窗口外单击,弹出窗口的样式StageStyle.UTILITY似乎也会将弹出窗口保持在全屏窗口的前面。

我在java 1.8.0_40中使用新的Alert类时看到了同样的问题,并且将样式设置为StageStyle.UTILITY也修复了它(Dialog.initStyle(StageStyle) -- JavaFX 8)。

我不知道为什么会这样。

旁注:

删除对popupStage.initOwner(...)的调用似乎允许弹出窗口显示在全屏应用程序上方,但在弹出窗口外单击会导致弹出窗口消失。