如何创建现有 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:
FXMLLoader
解析文件
FXMLLoader
创建与 FXML
文件中的实例元素对应的对象实例,并在与 FXML
文件中的 属性 元素对应的那些对象上设置属性。
- 如果根元素上有
fx:controller
属性,则 FXMLLoader
创建指定 class 的实例
FXMLLoader
使用 fx:id
与字段名称匹配的相应元素初始化控制器中任何 @FXML
注释的字段。
- 如果控制器有一个
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
生命周期的完整列表,但足以解释在这种情况下发生的事情。
是否可以创建一个可以访问的 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:
FXMLLoader
解析文件FXMLLoader
创建与FXML
文件中的实例元素对应的对象实例,并在与FXML
文件中的 属性 元素对应的那些对象上设置属性。- 如果根元素上有
fx:controller
属性,则FXMLLoader
创建指定 class 的实例
FXMLLoader
使用fx:id
与字段名称匹配的相应元素初始化控制器中任何@FXML
注释的字段。- 如果控制器有一个
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
生命周期的完整列表,但足以解释在这种情况下发生的事情。