2017-05-11 11 views
2

TreeViewの選択項目リストの内容をバインドし、要素を削除するときに、選択した項目の変な動作にぶつかりたい。 ListViewアイテムにアイテムを選択しJavaFX:TreeViewのbindContents selectedItems

public class TreeViewSelectedItemsBindingTest extends Application { 

    public class Item extends TreeItem<Integer> { 
     public Item(Integer... value) { 
      Arrays.stream(value).forEach(v -> getChildren().add(new TreeItem<Integer>(v))); 
     } 
    } 

    @Override 
    public void start(Stage primaryStage) throws Exception { 

     TreeView<Integer> treeView = new TreeView<>(); 
     treeView.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE); 
     treeView.setRoot(new Item(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)); 
     treeView.getRoot().setExpanded(true); 
     treeView.setShowRoot(false); 

     ListView<TreeItem<Integer>> listView = new ListView<>(); 

     Bindings.bindContent(listView.getItems(), treeView.getSelectionModel().getSelectedItems()); 

     treeView.getSelectionModel().getSelectedItems() 
       .addListener((ListChangeListener<? super TreeItem<Integer>>) change -> { 
        System.out.println("Change: " + change); 
        System.out.println("TreeView size: " + treeView.getSelectionModel().getSelectedItems().size()); 
        System.out.println("ListView size: " + listView.getItems().size()); 
        System.out.println("-------------------"); 
       }); 

     HBox box = new HBox(); 
     box.getChildren().addAll(treeView, listView); 
     primaryStage.setScene(new Scene(box)); 
     primaryStage.show(); 
    } 

    static public void main(String[] args) { 
     launch(args); 
    } 
} 

このアプリケーションバインドTreeView:私はいくつかのテストアプリケーションを書きました。ツリービューで、0から9までのすべての要素を選択し、次にSHIFT +要素5を押して、選択範囲を0から5要素に変更します。あなたはexeptionを得ます:

Exception in thread "JavaFX Application Thread" java.lang.IndexOutOfBoundsException: toIndex = 9 

はListChangeListener.Changeが変更されていないリストを初期するインデックス相対から報告するので、それがある、ない相対的なリストは、以前に変更されました:

------------------- 
Change: { [TreeItem [ value: 6 ]] removed at 6, } 
TreeView size: 9 
ListView size: 9 
------------------- 
Change: { [TreeItem [ value: 7 ]] removed at 7, } 
TreeView size: 8 
ListView size: 8 
------------------- 

あなたは「6で除去する」を参照してくださいすることができます"7時に削除"されましたが、基になるリストのサイズも変更されたので、ここでインデックスを増やすべきではありません。つまり、 "削除時"はすべて6でなければなりません。

+0

実際の質問は何ですか?これは非常にはっきりとバグです。すでにバグレポートを提出していないと仮定して、バグレポートを提出するべきです(http://bugs.java.com/)。 –

+0

これはバグかTreeViewの既知の機能ではありませんでした。私はバグレポートを提出しようとします。 – sdorof

答えて

0

これはバグJDK-8180359です。回避策として、ボンドリスト全体を更新する必要があります。

treeView.getSelectionModel().getSelectedItems().addListener(
    (ListChangeListener<? super TreeItem<Model>>) change -> { 
      while (change.next()) { 
       listView.setAll(change.getList().stream() 
         .filter(Objects::nonNull) 
         .map(i -> i.getValue()) 
         .collect(toList())); 
      } 
     }); 
関連する問題