JavaFX 8中stage.setResizable(false)与setMaximized(true)失效问题
我碰到过这个问题!在JavaFX 8里,你遇到的情况是因为setResizable(false)会重置窗口的最大化状态——当你调用这个方法时,如果窗口已经处于最大化,它会自动缩回到之前的大小,所以你的代码顺序导致最大化效果被覆盖了。
问题根源
你的代码执行顺序是先把窗口设为最大化,再禁用调整大小,但JavaFX 8的setResizable(false)方法有个特性:一旦调用它,当前的最大化状态会被取消,窗口回到默认尺寸。这就是为什么只有不可调整大小生效,最大化没效果的原因。
解决方案
这里提供两种可靠的实现方式:
方案1:直接匹配屏幕可视区域(兼容性最好)
这种方法不依赖窗口的最大化状态,直接把窗口的位置和尺寸设置为屏幕的可视范围(自动排除任务栏、dock等系统元素),效果和最大化完全一致:
public void start(Stage stage) throws Exception { Parent root = FXMLLoader.load(getClass().getResource("FXMLDocument.fxml")); Scene scene = new Scene(root); stage.setScene(scene); // 获取主屏幕的可视区域 Rectangle2D screenBounds = Screen.getPrimary().getVisualBounds(); // 设置窗口位置和尺寸完全匹配屏幕 stage.setX(screenBounds.getMinX()); stage.setY(screenBounds.getMinY()); stage.setWidth(screenBounds.getWidth()); stage.setHeight(screenBounds.getHeight()); stage.setResizable(false); stage.show(); }
方案2:调整执行顺序(基于最大化API)
如果你更倾向于使用setMaximized(true),可以先让窗口显示,再设置最大化,最后禁用调整大小。窗口显示后已经处于最大化状态,此时再禁用调整大小就不会触发状态重置了:
public void start(Stage stage) throws Exception { Parent root = FXMLLoader.load(getClass().getResource("FXMLDocument.fxml")); Scene scene = new Scene(root); stage.setScene(scene); stage.show(); // 先显示窗口 stage.setMaximized(true); // 再设置最大化 stage.setResizable(false); // 最后禁用调整大小 }
方案1的优势是不受平台或JavaFX版本细微行为差异的影响,兼容性更强;方案2更贴合你最初的代码思路,在JavaFX 8环境下可以稳定运行。
内容的提问来源于stack exchange,提问作者Swapnil




