You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaFX场景下Pane控件无法显示矩形网格问题求助

问题根源

  • 布局渲染时机错误:控制器的initialize方法执行时,boardPane仅完成了属性注入,还未经过场景图的布局计算,此时调用getWidth()、getHeight()获取到的数值为0,后续的网格计算逻辑、循环生成矩形的代码完全不会执行,自然没有网格渲染。
  • 无效属性设置:Rectangle的opacity属性合法取值范围是0.0(完全透明)~1.0(完全不透明),设置为2属于无效值,会被默认修正为1.0,这个虽然不是主因,但属于不规范写法。

修复方案

需要等boardPane完成布局渲染、宽高确定后再执行网格生成逻辑,推荐通过监听boardPane的宽高属性变化触发逻辑,该方案同时支持窗口缩放时自动适配网格大小:

@FXML
public void initialize() {
    message.setText("Working");
    int grid = 12;
    // 监听宽高变化,布局完成后自动触发网格生成
    boardPane.widthProperty().addListener((obs, oldVal, newVal) -> {
        if (newVal.doubleValue() > 0 && boardPane.getHeight() > 0) {
            generateGrid(grid);
        }
    });
    boardPane.heightProperty().addListener((obs, oldVal, newVal) -> {
        if (newVal.doubleValue() > 0 && boardPane.getWidth() > 0) {
            generateGrid(grid);
        }
    });
}

// 单独封装网格生成逻辑
private void generateGrid(int gridCount) {
    // 清空原有子节点,避免重复添加网格
    boardPane.getChildren().clear();
    int w = (int) boardPane.getWidth();
    int h = (int) boardPane.getHeight();
    int scaleW = w / gridCount;
    int scaleH = h / gridCount + 5;

    for (int i = 0; i < w; i += scaleW) {
        for (int j = 0; j < h; j += scaleH) {
            Rectangle rectangle = new Rectangle(i, j, scaleW, scaleH);
            rectangle.setFill(Color.LIGHTYELLOW);
            rectangle.setOpacity(1); // 修正为合法取值
            rectangle.setStroke(Color.BLACK);
            boardPane.getChildren().add(rectangle);
        }
    }
}

如果不需要适配窗口大小,也可以直接使用FXML中定义的固定宽高值替代动态获取的宽高:int w = 600; int h = 300;,直接放在原initialize方法中即可生效。

内容的提问来源于stack exchange,提问作者Aniket Verma

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.12 14:27:02