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
相关产品推荐
相关产品推荐

