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ć




