如何创建现有 JavaFX 对象的数组

How to Create an Array of existing JavaFX objects

是否可以创建一个可以访问的 JavaFX 对象数组。

目前我有:

    @FXML
    private CheckBox pc1,pc2,pc4,pc8,pc16,pc32,pc64,pc128,pc256,pc512,pc1024,pc2048;

    private final CheckBox[] pcController = {pc1,pc2,pc4,pc8,pc16,pc32,pc64,pc128,
                                             pc256,pc512,pc1024,pc2048};

我正在尝试访问这些对象并根据不同数组中的值翻转复选框:

    

    boolean[] bits = getBits();

    for(int i =0; i<pcController.length;i++){
        pcController[i].setSelected(bits[i]);
    }

我收到错误:

Cannot invoke "javafx.scene.control.CheckBox.setSelected(boolean)" because "this.pcController[i]" is null ...

编辑: 因此,如果我在方法中实例化数组,我可以使系统半工作。

FXMLLoader 加载 FXML 文件时,会发生以下情况1

  1. FXMLLoader解析文件
  2. FXMLLoader 创建与 FXML 文件中的实例元素对应的对象实例,并在与 FXML 文件中的 属性 元素对应的那些对象上设置属性。
  3. 如果根元素上有 fx:controller 属性,则 FXMLLoader 创建指定 class
  4. 的实例
  5. FXMLLoader 使用 fx:id 与字段名称匹配的相应元素初始化控制器中任何 @FXML 注释的字段。
  6. 如果控制器有一个 initialize() 方法,它会被调用。

在您的代码中,您声明数组并内联初始化它:

@FXML
private CheckBox pc1,pc2,pc4,pc8,pc16,pc32,pc64,pc128,pc256,pc512,pc1024,pc2048;

private final CheckBox[] pcController = {pc1,pc2,pc4,pc8,pc16,pc32,pc64,pc128,
                                         pc256,pc512,pc1024,pc2048};

这意味着该数组将在创建控制器时为其赋值,这在上面的步骤 3 中。由于 12 CheckBox 尚未初始化(因为这发生在第 4 步),您将创建一个包含 12 null 个值的数组。

而是在initialize()方法中初始化数组:

public class MyController {

    @FXML
    private CheckBox pc1,pc2,pc4,pc8,pc16,pc32,pc64,pc128,pc256,pc512,pc1024,pc2048;

    private final CheckBox[] pcController ;

    @FXML
    private void initialize() {
        pcController = new CheckBox[]{pc1,pc2,pc4,pc8,pc16,pc32,pc64,pc128,
                                             pc256,pc512,pc1024,pc2048};
    }

    // ...
}

(1) 这不是 FXMLLoader 生命周期的完整列表,但足以解释在这种情况下发生的事情。