You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

JavaFX多全屏Stage冲突:新Stage触发主Stage退出全屏

解决JavaFX新全屏Stage导致主Stage退出全屏的问题

我之前也碰到过一模一样的情况,这其实是因为大多数操作系统默认只允许一个独占全屏窗口(单显示器场景下)——当你给新Stage调用setFullScreen(true)时,系统会自动让之前的全屏主Stage退出全屏模式,来释放独占权。下面是两种可行的解决方案:

方案一:手动设置新Stage尺寸为屏幕大小(推荐)

不需要将新Stage设置为全屏,而是让它的尺寸完全匹配主Stage所在屏幕的大小,同时保持透明样式和顶层显示,这样既可以实现覆盖全屏的效果,又不会触发系统的全屏切换逻辑。

修改你的新Stage创建代码如下:

root = new StackPane();
scene = new Scene(root);
stage = new Stage(StageStyle.TRANSPARENT);
image = new ImageView(new Image(imagePath, 400, 580, true, true));
root.setAlignment(Pos.CENTER);
root.setStyle("-fx-background-color: rgba(0, 0, 0, 0.5)");
root.getChildren().add(image);
scene.setFill(Color.TRANSPARENT);
scene.setOnMousePressed(event -> stage.close());

// 获取主Stage所在屏幕的可视边界(适配多显示器场景)
Stage mainStage = Window.getInstance().getStage();
Screen mainScreen = mainStage.getScreen();
Rectangle2D screenBounds = mainScreen.getVisualBounds();

stage.initOwner(mainStage);
// 设置新Stage始终显示在最顶层
stage.setAlwaysOnTop(true);
// 手动设置新Stage的位置和尺寸为屏幕大小
stage.setX(screenBounds.getMinX());
stage.setY(screenBounds.getMinY());
stage.setWidth(screenBounds.getWidth());
stage.setHeight(screenBounds.getHeight());

stage.setScene(scene);
// 移除这行代码,避免触发系统全屏切换
// stage.setFullScreen(true);
stage.setFullScreenExitHint(null);
stage.setFullScreenExitKeyCombination(KeyCombination.NO_MATCH);
stage.show();

方案二:调整新Stage的全屏策略(仅部分系统有效)

如果你确实需要使用setFullScreen(true),可以尝试给新Stage添加无模态配置,不过这种方法在不同操作系统上表现可能不一致,不如方案一稳定:

// 在设置initOwner之后添加
stage.initModality(Modality.NONE);
stage.setFullScreen(true);

原理说明

JavaFX的setFullScreen(true)会请求操作系统的全屏独占模式,这种模式下系统会强制其他全屏窗口退出。而手动设置尺寸的方式只是让窗口铺满屏幕,并没有进入系统级的独占全屏,所以主Stage的全屏状态不会被打断。

内容的提问来源于stack exchange,提问作者Duško Mirković

火山引擎 最新活动