2016-08-28 4 views
0

ListViewで動作が異常になってしまいました。JavaFXリストビューを観測可能なリストに追加しても変更が反映されず、選択できません

@FXML 
    private ListView<Weapon> listViewWeapons; 
    ... 
    private final ObservableList<Loadout> loadoutList; 

    public LoadoutViewController() { 
     ... 
     loadoutList =FXCollections.observableList(CsgoRr.getModel().getLoadoutCache()); 
     ... 
    } 

@Override 
public void initialize(URL location, ResourceBundle resources) { 
    ... 
    listViewLoadouts.setItems(loadoutList); 
    ... 

} 

私はリスト

@FXML 
    private void newLoadoutOnAction() { 
     try { 

      Loadout loadoutToBeStored = new Loadout(new Long[10], "Loadout" + newDuplicateNameLoadoutIncrement); 
      loadoutToBeStored.setId(DbUtil.storeLoadout(loadoutToBeStored));//store and set id. 
      CsgoRr.getModel().getLoadoutCache().add(loadoutToBeStored); 
      System.out.println("Stored new loadout "); 
      listViewLoadouts.getSelectionModel().select(loadoutToBeStored); 
      for (Loadout loadout : loadoutList) { 
       System.out.println("DEBUG LOADOUT CONTAINER OBSERVABLE:" + loadout); 
      } 
     } catch (SQLException ex) {//duplicate name 
      if (ex.getErrorCode() == 23505) { 
       newDuplicateNameLoadoutIncrement++; 
       newLoadoutOnAction(); 
      } 
      Logger.getLogger(LoadoutViewController.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 

に新しいバックパック内を追加する機能を有しているボタンに添付メソッドを呼び出すすべてのデータが正しくロードされ、保存されている、私はもちろんのその部分をデバッグしています。しかし、メソッドnewLoadoutOnActionを呼び出しても、observableリストが参照するリストにデータを入れても、そのlistViewのサイズを変更するまでは変更は見られません。これは唯一の問題ではなく、リストビューのサイズを変更してもリスト内のアイテムを見ることができません。選択できません。このアイテムを選択するには、再度コンストラクタとイニシャライザを呼び出す必要があります。私はこの動作に遭遇したことはありません。どうすればこれらの問題を解決できますか?リストで爽やかなアイテムと

問題:私はそれを得ることができない私は、アイテムを削除し、それらを再度設定しようとしたが、この問題の芽を何に共通するいくつかの他のソリューションは、私がsetItems(null)を入れても、働いていました作業するには、アイテムはまだそこにあります。

コントローラを再度呼び出してすべてを再作成するまで、(UI経由)を選択することはできません。私はこの項目をコードで選択しました。

listViewLoadouts.getSelectionModel().select(loadoutToBeStored); 

この実際に選択に必要な項目芽私は、UIの任意のフィードバックが表示されていないと私は私のマウスでそれを選択することはできません。この行を削除しても、私は再びビューを呼び出す(コンストラクタと初期化子)までマウスで選択することはできません。

これはちょっと複雑な問題なので、私はgifで何が起きているのかを見てみることにしました。

enter image description here

は、それは明らかだと思います。

答えて

3

FXCollections.observableList状態のJavadoc:基礎となるリストに直接作られた変異操作は、それをラップ任意のObservableListのオブザーバーに報告されていないことを

注意。このような理由のためにloadoutList

は、作成後にCsgoRr.getModel().getLoadoutCache()にリストに接続されていません。つまり、newLoadoutOnAction()呼び出しがとき:

CsgoRr.getModel().getLoadoutCache().add(loadoutToBeStored); 

それがloadoutListによってピックアップされていないか、またはリストビューがそれを見て。 CsgoRr.getModel().getLoadoutCache()をObservableListを使用するように変更し、それをloadoutListに直接割り当てると、関数は必要に応じて機能するはずです。

他のオプションではなく、loadoutListにごloadoutToBeStoredを追加することですが、私は、私が観測作らちょうど直接私のキャッシュを接続する簡単な解決策を取っ@Geoff、あなたはまた、CsgoRr.getModel()

+0

おかげでリストと同期する必要がありますそれはなぜそれが動作するのかと思っていますが、私はコンテンツをすべて印刷していたときにドキュメントを読んでいました。私はビューwasnt :)を発見したので、データは正しい芽です。 –

関連する問題