我正在使用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实例,而不是修改它中的一个实例。有什么建议吗?
答案 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;