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는 실패합니다.
잘 들어 맞습니까?하지만 실제 질문은 무엇입니까? 이것은 매우 명확한 버그이며, 아직 제출하지 않았다면 [버그 리포트 제출] (http://bugs.java.com/)해야합니다. –
이 버그 또는 TreeView 알려진 된 기능을 확실하지 않았습니다. 나는 버그 보고서를 제출하려고 시도 할 것이다. – sdorof