2017-06-09 1 views
0

Ich möchte Schlüssel (Branch) von ObservableHashmap in Spalte von TableView hinzufügen. Also habe ich mit Tableview HashMap wie folgt aus:TableView mit HasMap.keySet() wird nicht dynamisch aktualisiert

ObservableMap<Branch, Boolean> myMap = FXCollections.observableHashMap(); 
ObservableList<Branch> lst = FXCollections.observableArrayList(myMap.keySet()); 
this.chosenBranTable.setItems(lst); 

... und definiert CellValueFactory auf diese Weise:

this.chosenBranColumn.setCellValueFactory((CellDataFeatures<Branch, String> listItem) -> 
{ 
    return new ReadOnlyObjectWrapper<String>(listItem.getValue().toString()); 
}); 

Das Problem ist, dass - wenn ich mich verändert habe myMap gibt es keine Änderungen in der Tableview . Aber wenn ich ausgeführt habe:

nach dem Ändern von myMap dann Änderungen in der TableView erschien. Vor ObservableHashMap habe ich ObservableList verwendet und es gab kein Problem mit der Aktualisierung.

Antwort

0

Lesen the documentation:

eine neue beobachtbaren Array-Liste erstellt und fügt einen Gehalt an Sammlung col zu.

Beachten Sie, dass es keinen ObservableList schafft gesichert von der angegebenen Sammlung; Es erstellt lediglich eine ObservableList, deren anfänglicher Inhalt die Elemente der angegebenen Collection sind.

Auch wenn es von der Sammlung unterstützt würde, wäre Ihr Ziel nicht erreichbar, da die Elemente einer HashMap keine definierte Reihenfolge haben. Wenn Elemente zu einer HashMap hinzugefügt werden, kann sich die Reihenfolge der Schlüssel ändern.

Ein effektiver Ansatz ist es, eine ObservableMap von einem LinkedHashMap zu schaffen, die ihre Ordnung tut erhalten:

ObservableMap<Branch, Boolean> myMap = 
    FXCollections.observableMap(new LinkedHashMap<Branch, Boolean>()); 

Aber Sie müssen noch manuell ObservableList auf Änderungen in der ObservableMap reagieren machen:

ObservableList<Branch> lst = FXCollections.observableArrayList(myMap.keySet()); 
myMap.addListener(new MapChangeListener<? extends Branch, ? extends Boolean>() { 
    @Override 
    public void onChanged(Change<? extends Branch, ? extends Boolean> change) { 
     boolean removed = change.wasRemoved(); 
     boolean added = change.wasAdded(); 
     Branch key = change.getKey(); 

     if (removed && !added) { 
      lst.remove(key); 
     } 
     if (added && !removed) { 
      lst.add(key); 
     } 
    } 
}); 
+0

Dank für die ausführliche Antwort. Sie haben meine Bedenken bezüglich der Erstellung einer neuen Liste, die nicht gesichert ist, zerstreut. Zuvor war ich am Ende der Antwort verwirrt: https://stackoverflow.com/questions/31916041/how-doi-i-use-a-map-as-a-tableview-observablemap-object-parameter?rq= 1 – palandlom

0

ich glaube, Sie MapChangeListener

wie diese verwenden müssen:

private final MapChangeListener<K,V> mapChange; 

mapChange = new MapChangeListener<K, V>() { 
      @Override 
      public void onChanged(MapChangeListener.Change<? extends K, ? extends V> change) { 
       // 
      } 
     }; 

für weitere Informationen: https://pastebin.com/NmdTURFt

+0

Es scheint so. Vielen Dank! – palandlom

+0

Legen Sie die Details Ihrer Antwort nicht auf einer externen Website ab. Diese URL wird schließlich veraltet sein, und wenn dies der Fall ist, wird Ihre Antwort für zukünftige Leser wenig nützlich sein. – VGR

Verwandte Themen