2017-08-11 31 views
0

編輯ObservableList不復制

原來,這FXCollections.observableArrayList()是創造我的列表的淺表副本的出現當我真正想要的深層複製。 this.valuevalue「指向」兩個不同的ObservableList s,但它們包含「指向」同一個對象而不是副本。

原始

至於應用,我使得用戶可以打開一個ObservableList的內容和編輯它的一部分。爲了讓他們取消並放棄任何更改,我製作了這個ObservableList的副本,讓他們在副本上工作。然後,如果他們選擇保存更改,我使用副本的內容更新ObservableList的變量。

複製使用下面的功能setValues完成。該功能屬於編輯窗口的fx控制器,由主窗口的控制器調用。

public void setValues(ObservableList<String[]> values) { 
    if (values == null) { 
     this.values = FXCollections.observableArrayList(); 
    } else { 
     this.values = FXCollections.observableArrayList(values); 
    } 
    lstView.setItems(this.values); 
} 

至於我有蜜蜂能找到,上面的代碼應該創建的values副本,以便this.valuesvalues包含相同的信息,但也不盡相同ObservableList。 但是,實際上這兩個仍然看起來是同一個對象,所以對this.values的任何更改也將作出values

這是唯一給this.value分配一個值的地方。任何人有什麼想法我做錯了什麼?

這是所有使用JavaFX和Java 8

+0

你爲什麼說是同一個對象?你打印兩個對象的'toString()'是否一樣? –

+0

@ easyjoin.net,我在調試模式下運行應用程序,並在更改保存到「複製」的行上設置了斷點。當我瀏覽代碼時,我正在查看內存,並且可以看到原來的內容和「副本」,只有「副本」纔會發生變化。 – user9985

+0

然後錯誤發生在另一個地方,而不是您發佈的代碼。 –

回答

0

正在複製包含字符串數組引用列表來完成。 該副本僅複製第一級引用 - 即引用數組而不是這些數組中的字符串值。

我們得到的副本是兩個獨立的列表,指向具有相同字符串的相同物理數組。 下面是展示此行爲的代碼:

public class Main { 

    public static void main(String[] args) { 

     String [] a = {"aaa"}; 
     List<String[]> values = new LinkedList<>(); 
     values.add(a); 

     List<String[]> v2 = FXCollections.observableArrayList(values); 

     String[] b = values.get(0) ; 
     b[0] = "1"; 

     System.out.println(v2.get(0)[0]); 
     System.out.println(values.get(0)[0]); 
    } 
} 

這裏是做了更深層次的複製解決方案:

public class Main { 

    public static void main(String[] args) { 

     String [] a = {"aaa"}; 
     List<String[]> values = new LinkedList<>(); 

     values.add(a); 


     List<String[]> copy = new ArrayList<>(); 
     for(String[] stringArray : values) { 
      String[] newArray = Arrays.copyOf(stringArray, stringArray.length); 
      copy.add(newArray); 
     } 


     values.get(0)[0] = "bbb"; 

     System.out.println(values.get(0)[0]); 
     System.out.println(copy.get(0)[0]); 
    } 
} 
+0

完美!謝謝:D – user9985