2017-06-09 11 views
0

TableViewの列にObservableHashmapのキー(分岐)を追加します。だから私はそのようにHashMapとテーブルビューを作成しました:HasMap.keySet()があるTableViewは動的に更新されません

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

...と、このようにCellValueFactoryを定義した:

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

問題があることである - 私が変更されたときにMYMAPテーブルビューには変更はありません。しかし、実行した場合:

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

mymapの変更後、TableViewの変更が表示されました。 ObservableHashMapの前ObservableListを使用しましたが、更新に問題はありませんでした。

答えて

0

読むthe documentation

は、新たな観測可能な配列リストを作成し、それを収集colの内容を追加します。

ObservableList は、指定されたコレクションによってにバックアップされていることに注意してください。 ObservableListを作成するだけで、その初期の内容は指定されたCollectionの要素になります。

HashMapの要素には定義された順序がないため、コレクションによってバッキングされていても、目標は達成できません。要素がHashMapに追加されると、キーの順序が変更される可能性があります。

1つの効果的なアプローチは、その順序を保持しのLinkedHashMap、からObservableMapを作成することです:

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

しかし、あなたはまだ手動でObservableListはObservableMapの変化に対応するために必要があります。

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

ありがとうございます。あなたは裏づけられていない新しいリストを作成することに疑念を払わなかった。その前に、私は答えの最後まで混乱しました:https://stackoverflow.com/questions/31916041/how-do-i-use-a-map-as-a-tableview-observablemap-object-parameter?rq= 1 – palandlom

0

あなたはMapChangeListenerを使う必要があると思います。

0詳細は
private final MapChangeListener<K,V> mapChange; 

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

:詳細な回答のためhttps://pastebin.com/NmdTURFt

+0

そうそうです。ありがとう! – palandlom

+0

回答の詳細を外部サイトに配置しないでください。そのURLは最終的には古くなり、そうすると、あなたの答えは将来の読者にはほとんど役に立たないでしょう。 – VGR

関連する問題