JavaFX弹出窗口在舞台全屏模式下隐藏

3
我正在尝试在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!");
    }
}

在我的1.8.0_20-ea上运行良好。也许尝试一下 Platform.runLater(()->popupStage.requestFocus()); 看看是否有帮助。 - brian
你在使用Mac电脑吗? - James_D
@brian,你在哪里找到了Java版本1.8.0_20-ea? - Kevin S
https://jdk8.java.net/ 我想,EA代表早期访问。我看到Oracle已经发布了第25个版本,而EA版本已经更新到40。 - brian
2个回答

3

在尝试了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(...)的调用似乎可以使弹出窗口出现在全屏应用程序之上,但是点击弹出窗口外部会导致弹出窗口消失。


这也适用于macOS Monterey。 - Mohsin AR

2
假设您使用的是Mac,这个已知问题在8u40中得到了修复。您可能需要使用ea版本直到完整版本发布。
这个错误的基本历史是JavaFX实现了自己的全屏实现,以支持OS X 10.7之前的版本(这些版本没有本地全屏模式)。该实现使用“独占模式”,防止其他窗口显示。这可能会非常糟糕:例如,ComboBox将无法工作...这个问题在8u40中通过使用本机模式来解决(因为不再支持OS X 10.7之前的版本)。
请注意,如果您不编程设置全屏模式,并允许用户使用窗口标题栏上的Mac OS按钮进入全屏,则不应出现此问题。

1
谢谢提供的信息,我实际上正在使用CentOS 6.5并且使用Gnome界面。 - Kevin S
检查8u40的ea版本;如果它仍然表现相同,我建议提交一个错误报告 - James_D
同样是Swing的问题,并且使用了最新的JDK(17)。 - bourne2program

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接