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

Ell*_*son -2 java arrays javafx

是否可以创建可访问的 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};
Run Code Online (Sandbox Code Playgroud)

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

    

    boolean[] bits = getBits();

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

Run Code Online (Sandbox Code Playgroud)

我收到错误:

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

编辑:所以如果我在方法内实例化数组,我可以让系统半工作。

Jam*_*s_D 6

当加载文件时,会按以下顺序发生以下情况1FXMLLoaderFXML

  1. 解析FXMLLoader文件
  2. 创建FXMLLoader与文件中的实例元素相对应的对象实例FXML,并在与文件中的属性元素相对应的那些对象上设置属性FXML
  3. fx:controller如果根元素上有属性,则FXMLLoader创建指定类的实例
  4. 使用与字段名称匹配的相应元素初始化控制器中的FXMLLoader任何带注释的字段。@FXMLfx:id
  5. 如果控制器有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};
Run Code Online (Sandbox Code Playgroud)

这意味着在创建控制器时将为数组分配其值,这是上面的步骤 3 中的内容。由于 12CheckBox尚未初始化(因为这发生在步骤 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};
    }

    // ...
}
Run Code Online (Sandbox Code Playgroud)

(1) 这不是生命周期的完整列表FXMLLoader,但足以解释本例中发生的情况。