Java 阵列中的MedusaFX元素,如果编辑阵列,则不更新屏幕

Java 阵列中的MedusaFX元素,如果编辑阵列,则不更新屏幕,java,arrays,arraylist,Java,Arrays,Arraylist,我正在使用MedusaFX库为我正在进行的项目获取仪表。我正在使用JavaFX应用程序运行一切,并使用Scene Builder创建一个FXML文件来创建布局。我观察到的是如果我这样做 @FXML private Gauge gauge1 = new Gauge(); gauge1.setValue(30); 然后,gauge1变量获得正确的值集。然而,如果我这样做 @FXML private Gauge gauge1 = new Gauge(); ArrayL

我正在使用MedusaFX库为我正在进行的项目获取仪表。我正在使用JavaFX应用程序运行一切,并使用Scene Builder创建一个FXML文件来创建布局。我观察到的是如果我这样做

    @FXML private Gauge gauge1 = new Gauge();
    gauge1.setValue(30);
然后,gauge1变量获得正确的值集。然而,如果我这样做

    @FXML private Gauge gauge1 = new Gauge();
    ArrayList<Gauge> list = new ArrayList<>();
    list.add(gauge1);
    list.get(0).setValue(30);

    System.out.println(gauge1);
    System.out.println(list.get(0));

这个输出让我感到困惑,因为ArrayList似乎创建了Gauge的一个新实例,而不是修改其中的实例。有什么建议吗?

当您使用
FXMLLoader.load()
加载fxml文件时,它将解析该文件,并为找到的每个节点创建一个实例

因此,假设在fxml文件中有一个
Gauge
节点,带有
fx:id=“gauge1”
,将其添加到控制器时:

@FXML private Gauge gauge1;
@FXML private Gauge gauge1;
fxmloader
将为您创建一个实例。然后可以设置如下值:

public void initialize() {
    gauge1.setValue(30);
}
但当你这样做的时候:

@FXML private Gauge gauge1 = new Gauge();
实际情况是,您正在创建第二个实例:第一个实例是通过反射创建的,仅基于
fx:id
标签,并通过
fxmloader
添加到场景图中,而您创建的第二个实例从未添加到场景图中

稍后,您不知道要修改的实际实例是什么。执行打印输出时,可能正在访问两个对象,即列表中未添加到场景图的对象

因此解决方案很简单:不要创建第二个实例,只使用以下方法:

@FXML private Gauge gauge1;