数组中的MedusaFX元素,如果编辑数组,则不更新屏幕

时间:2017-06-05 16:06:35

标签: java arrays arraylist

我正在使用MedusaFX库来获取我正在进行的项目的测量。我使用JavaFX应用程序运行所有内容和Scene Builder来创建FXML文件以创建布局。我所观察到的是,如果我做了

    @FXML private Gauge gauge1 = new Gauge();
    gauge1.setValue(30);

然后gau1变量获得正确的值集。但是,如果我这样做

    @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));

我的输出是

{"title":"Temperature","subTitle":"Temperature","unit":"°F","value":0.0,"minValue":0.0,"maxValue":175.0,"threshold":60.0,"minMeasuredValue":0.0,"maxMeasuredValue":0.0}
{"title":"","subTitle":"","unit":"","value":30.0,"minValue":0.0,"maxValue":100.0,"threshold":100.0,"minMeasuredValue":30.0,"maxMeasuredValue":30.0}

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

1 个答案:

答案 0 :(得分:0)

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

因此,假设您的fxml文件中有一个Gauge节点fx:id="gauge1",当您将其添加到控制器时:

@FXML private Gauge gauge1;

FXMLLoader将为您创建一个实例。然后,您可以设置如下值:

public void initialize() {
    gauge1.setValue(30);
}

但是当你这样做时:

@FXML private Gauge gauge1 = new Gauge();

发生的事情是您实际上正在创建第二个实例:第一个实例是由反射创建的,仅基于fx:id标签,并由FXMLLoader添加到场景图中,而您创建的第二个从未添加到场景图中。

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

所以解决方案很简单:不要创建第二个实例,只使用这个:

@FXML private Gauge gauge1;