2017-05-11 11 views
2

TreeView 선택한 항목 목록의 내용을 바인딩하고 요소를 제거 할 때 선택한 항목의 이상한 동작에 부딪 히고 싶습니다. ListView 항목에 항목을 선택JavaFX : TreeView의 bindContent 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이어야합니다.이 때문에 Bindings.bindContent는 실패합니다.

+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())); 
      } 
     });