2017-06-05 57 views
0

我正在使用MedusaFX庫來獲取我正在處理的項目的測量儀。我正在使用JavaFX應用程序來運行所有內容,使用Scene Builder創建FXML文件以創建佈局。我觀察到的是,如果我做陣列中的MedusaFX元素,如果編輯陣列,請勿更新屏幕

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

我的輸出

{"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中創建計的新實例,而不是修改它其中的一個。有什麼建議麼?

回答

0

當你加載一個帶有FXMLLoader.load()的fxml文件時,它將解析這個文件,並且它會爲它找到的每個節點創建一個實例。

因此,假設不存在與fx:id="gauge1"您FXML文件Gauge節點,當你將它添加到你的控制器:

@FXML private Gauge gauge1; 

FXMLLoader會爲你創建一個實例。然後,您可以設置的值等:

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

但是,當你這樣做:

@FXML private Gauge gauge1 = new Gauge(); 

正在發生的事情是,你實際上是在創建第二個實例:第一種是通過反射產生,正是基於在fx:id標籤上,並通過FXMLLoader將其添加到場景圖形中,而您創建的第二個則永遠不會添加到場景圖形中。

稍後,您不知道您正在修改的實際實例是什麼。當你打印輸出時,可能你正在訪問這兩個對象,就像列表中沒有添加到場景圖上的對象一樣。

因此,解決辦法很簡單:不創建第二個實例,只需使用這個:

@FXML private Gauge gauge1;