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

JavaFX与Scene Builder中如何创建带FX ID的节点列表

解决JavaFX中Scene Builder无法注入数组/列表管理Square对象的问题

方法1:逐个注入后手动添加到列表

Scene Builder支持为每个Square单独设置FX ID,你可以给每个Square命名为squareRowCol(比如square00对应第0行第0列,直到square77),然后在控制器中逐个注入,再统一加入列表:

import javafx.fxml.FXML;
import javafx.util.ResourceBundle;
import java.net.URL;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class YourController {
    // 逐个注入64个Square对象
    @FXML private Square square00;
    @FXML private Square square01;
    // ... 依次添加所有64个Square的FX ID注入
    @FXML private Square square77;

    private List<Square> squareList = new ArrayList<>();

    @Override
    public void initialize(URL url, ResourceBundle rb) {
        // 将所有Square添加到列表中
        squareList.addAll(Arrays.asList(
            square00, square01, ..., square77
        ));
    }
}

这种方法的优势是可以直接通过FX ID快速定位单个Square,适合需要单独操作特定位置方块的场景。

方法2:通过GridPane遍历子节点自动收集

如果不想逐个设置FX ID,可以直接注入容纳Square的GridPane,然后在初始化时遍历它的子节点,筛选出Square类型的对象并整理成列表:

import javafx.fxml.FXML;
import javafx.scene.Node;
import javafx.scene.layout.GridPane;
import javafx.util.ResourceBundle;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;

public class YourController {
    @FXML private GridPane squareGrid;
    private List<Square> squareList = new ArrayList<>();

    @Override
    public void initialize(URL url, ResourceBundle rb) {
        // 遍历GridPane子节点,收集所有Square对象
        for (Node node : squareGrid.getChildren()) {
            if (node instanceof Square) {
                squareList.add((Square) node);
            }
        }

        // 可选:按GridPane的行、列顺序排序列表(确保顺序和界面一致)
        squareList.sort((s1, s2) -> {
            int row1 = GridPane.getRowIndex(s1) == null ? 0 : GridPane.getRowIndex(s1);
            int col1 = GridPane.getColumnIndex(s1) == null ? 0 : GridPane.getColumnIndex(s1);
            int row2 = GridPane.getRowIndex(s2) == null ? 0 : GridPane.getRowIndex(s2);
            int col2 = GridPane.getColumnIndex(s2) == null ? 0 : GridPane.getColumnIndex(s2);
            
            return row1 != row2 ? Integer.compare(row1, row2) : Integer.compare(col1, col2);
        });
    }
}

这种方法更简洁,无需手动设置大量FX ID,适合批量操作所有Square的场景。如果需要定位特定行列的Square,可以通过列表结合行列索引计算位置。

补充说明

Scene Builder目前确实不支持直接将数组或列表作为FXML注入目标,上述两种方法是最常用的替代方案。你可以根据自己的需求选择:需要精准定位单个方块选方法1,追求代码简洁选方法2。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 20:22:12