有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何创建现有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};

我试图访问这些对象,并根据不同数组中的值翻转复选框,例如:

    

    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 ...

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


共 (1) 个答案

  1. # 1 楼答案

    当一个FXMLLoader加载一个FXML文件时,会发生以下事情:

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

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

    相反,在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生命周期的完整列表,但足以解释在这种情况下发生了什么