使用JavaFX场景生成器在数组中使用按钮填充fx id

使用JavaFX场景生成器在数组中使用按钮填充fx id,javafx,Javafx,我需要15个按钮在我的应用程序,但我不想宣布他们一个接一个像 @FXML private Button button1; @FXML private Button button2; @FXML private Button button3; ... ... ... ... 相反,我想创建一个按钮数组 @FXML private Button[][] button = new Button[5][3]; 但是,在场景生成器中,我只能选择一个按钮,我认为它引用的是数组而不是单个按钮元素。 有什么

我需要15个按钮在我的应用程序,但我不想宣布他们一个接一个像

@FXML
private Button button1;
@FXML
private Button button2;
@FXML
private Button button3;
...
...
...
...
相反,我想创建一个按钮数组

@FXML
private Button[][] button = new Button[5][3];
但是,在场景生成器中,我只能选择一个按钮,我认为它引用的是数组而不是单个按钮元素。 有什么方法可以让我轻松地完成这项工作吗?

我假设您只能通过使用
fxml
文件的代码来修改它

对于简单的
ArrayList
,您可以执行以下操作(选中并单击):

第一条路->1

        <fx:define>
          <!-- create buttons and store them in a list -->
           <ArrayList fx:id="buttonsArray">
              <Button fx:id="firstButton" />
              <Button fx:id="secondButton" />
              <Button fx:id="thirdButton" />
           </ArrayList>
        </fx:define>


        <!-- add buttons in the list to scene graph -->
        <fx:reference source="firstButton"/>
        <fx:reference source="secondButton"/>
        <fx:reference source="thirdButton"/>


2)

请注意,可以将数据存储在一个
数组列表中,如GoXR3Plus在其回答中所述。但是,不能在fxml中创建数组。要做到这一点,您需要从java代码创建数组(例如在
initialize
方法中),并将一些信息附加到
节点
,该节点允许您检索索引信息

例如,可以通过使用静态帮助器方法将信息以及css类选择器附加到节点,并将这些节点的公共祖先注入控制器来实现:


助手

public class Helper {

    private static final String MARK_CLASS = "array-store-mark";
    private static final String MARK_CLASS_SELECTOR = "." + MARK_CLASS;
    private static final String INDICES_KEY = "arrayStoreIndices";

    public static void setIndices(Node node, String indices) {
        if (node == null || indices == null) {
            throw new IllegalArgumentException();
        }
        String[] parts = indices.split("\\s+");
        int[] is = new int[]{Integer.parseInt(parts[0]), Integer.parseInt(parts[1])};

        // add css class
        node.getStyleClass().add(MARK_CLASS);

        // add index data
        node.getProperties().put(INDICES_KEY, is);
    }

    public static <T extends Node> T[][] getAsArray(Node parent, Class<T> nodeClass) {
        if (parent == null) {
            throw new IllegalArgumentException();
        }
        int max1 = 0;
        int max2 = 0;

        // find nodes by class
        Set<Node> marked = parent.lookupAll(MARK_CLASS_SELECTOR);

        // find array size
        for (Node n : marked) {
            n.getStyleClass().remove(MARK_CLASS);
            if (nodeClass.isAssignableFrom(n.getClass())) {
                int[] is = (int[]) n.getProperties().get(INDICES_KEY);
                if (max1 < is[0]) {
                    max1 = is[0];
                }
                if (max2 < is[1]) {
                    max2 = is[1];
                }
            }
        }

        T[][] result = (T[][]) Array.newInstance(nodeClass, max1+1, max2+1);

        // put data in array
        for (Node n : marked) {
            int[] is = (int[]) n.getProperties().remove(INDICES_KEY);

            if (nodeClass.isAssignableFrom(n.getClass())) {
                result[is[0]][is[1]] = (T) n;
            }
        }

        return result;
    }

}

非常感谢你!我完全理解,非常感谢你!这就像一个下一级的解决方案,我可能没有得到它。我会努力学习你的代码!
       <fx:define>
          <!-- create buttons and store them in a list -->
           <ArrayList fx:id="array">
              <Button fx:id="Button_0_0" /> //first row , first column
              <Button fx:id="Button_0_1" />
              <Button fx:id="Button_0_2" />
              <ArrayList fx:id="buttonsArray">
                  <Button fx:id="Button_1_0" /> //second row , first column
                  <Button fx:id="Button_1_1" />
                  <Button fx:id="Button_1_2" />
              </ArrayList>
           </ArrayList>
        </fx:define>


         <!-- add buttons in the list to scene graph -->
         <fx:reference source="Button_0_0" />
         <fx:reference source="Button_0_1" />
         <fx:reference source="Button_0_2" />
         <fx:reference source="Button_1_0" />
         <fx:reference source="Button_1_1" />
         <fx:reference source="Button_1_2" />
public class Helper {

    private static final String MARK_CLASS = "array-store-mark";
    private static final String MARK_CLASS_SELECTOR = "." + MARK_CLASS;
    private static final String INDICES_KEY = "arrayStoreIndices";

    public static void setIndices(Node node, String indices) {
        if (node == null || indices == null) {
            throw new IllegalArgumentException();
        }
        String[] parts = indices.split("\\s+");
        int[] is = new int[]{Integer.parseInt(parts[0]), Integer.parseInt(parts[1])};

        // add css class
        node.getStyleClass().add(MARK_CLASS);

        // add index data
        node.getProperties().put(INDICES_KEY, is);
    }

    public static <T extends Node> T[][] getAsArray(Node parent, Class<T> nodeClass) {
        if (parent == null) {
            throw new IllegalArgumentException();
        }
        int max1 = 0;
        int max2 = 0;

        // find nodes by class
        Set<Node> marked = parent.lookupAll(MARK_CLASS_SELECTOR);

        // find array size
        for (Node n : marked) {
            n.getStyleClass().remove(MARK_CLASS);
            if (nodeClass.isAssignableFrom(n.getClass())) {
                int[] is = (int[]) n.getProperties().get(INDICES_KEY);
                if (max1 < is[0]) {
                    max1 = is[0];
                }
                if (max2 < is[1]) {
                    max2 = is[1];
                }
            }
        }

        T[][] result = (T[][]) Array.newInstance(nodeClass, max1+1, max2+1);

        // put data in array
        for (Node n : marked) {
            int[] is = (int[]) n.getProperties().remove(INDICES_KEY);

            if (nodeClass.isAssignableFrom(n.getClass())) {
                result[is[0]][is[1]] = (T) n;
            }
        }

        return result;
    }

}
public class StoreController {

    // common parent
    @FXML
    private Parent root;

    private Button[][] buttons;

    @FXML
    private void initialize() {
        buttons = Helper.getAsArray(root, Button.class);
        System.out.println(Arrays.deepToString(buttons));
    }

}