You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动