2016-06-09 13 views
2

내 프로그램에 TreeViewButton이 있습니다. 이 Button을 클릭 할 때마다 TreeView에서 마지막으로 선택한 요소 바로 다음에 새 요소가 추가됩니다. 내가 "테스트 작업"요소를 선택하고 "추가"버튼을 클릭한다면 enter image description hereJavaFX : TreeView에서 TreeItem의 인덱스를 찾는 방법은 무엇입니까?

예를 들어, 바로 "테스트 작업"후,하지만 "테스트 상태"전에 다른 TreeItem를 추가해야합니다.

내가 요소의 추적 할 수 있도록 코드를 작성 마지막으로 선택한 :

@FXML 
TreeView<String> view; 
TreeItem<String> current = root; 
view.selectionModelProperty().addListener(new ChangeListener<MultipleSelectionModel<TreeItem<String>>>() { 

      @Override 
      public void changed(ObservableValue<? extends MultipleSelectionModel<TreeItem<String>>> observable, 
        MultipleSelectionModel<TreeItem<String>> oldValue, 
        MultipleSelectionModel<TreeItem<String>> newValue) { 
        current = newValue.getSelectedItem(); 
      } 
}); 

그러나, TreeItem의 사용을 통해, "현재"어떤 방법 내가 찾는 데 사용할 수 있습니다 TreeView의 인덱스입니다.

root.getChildren().add(index, new TreeItem<String>(new OpenBank().getAction(), Icons.ACTION.getIcon())); 

그래서 TreeView에서 아이의 인덱스를 찾을 수있는 방법이 : 내가 할 수 있도록

은?

답변

2

클래스 TreeItem은 메서드를 가지고 있으며, 지정된 TreeItem의 부모를 반환합니다. TreeItem 인이 부모는 자식을 얻는 getChildren 메서드를 가지고 있습니다. TreeItem; 반환 된 ObservableList에있는 TreeItem의 순서는 화면에서 볼 수있는 실제 순서이므로 indexOf()으로 목록의 요소 색인을 검색 한 후에 add을 사용하여 특정 색인에 새 요소를 삽입 할 수 있습니다.

당신은 단순히 Button의 이벤트 리스너에서 현재 선택을 처리 할 수 ​​

Button b = new Button("Add"); 
b.setOnAction(event -> { 
    // Get the selected item 
    TreeItem<String> selectedItem = treeView.getSelectionModel().getSelectedItem(); 

    // If there is no selection or the root is selected do nothing 
    if (selectedItem == null || selectedItem == rootNode) 
     return; 

    // Otherwise get the index of the Node from the children of its parent 
    // and append the new item right after it 
    int index = selectedItem.getParent().getChildren().indexOf(selectedItem); 
    selectedItem.getParent().getChildren().add(index+1, new TreeItem<>("New Item")); 
}); 

이미 현재의 선택 추적 경우

수정 단지 (current를 사용하는 것입니다을 즉, 변수의 이름을 지정하는 방법입니다.

Button b = new Button("Add"); 
b.setOnAction(event -> { 
    // If there is no selection or the root is selected do nothing 
    if (current == null || current == rootNode) 
     return; 

    // Otherwise get the index of the Node from the children of its parent 
    // and append the new item right after it 
    int index = current.getParent().getChildren().indexOf(current); 
    current.getParent().getChildren().add(index+1, new TreeItem<>("New Item")); 
}); 
+0

나는 이것이 깊이 1의 나무의이 특정한 상황에 대해서만 작용한다고 생각한다. 당신은 임의의 나무를 위해 그것을하는 효율적인 방법을 안다? – Eduardo

+0

모든 레벨에서 작동해야합니다. 예를 들어, 레벨 3 리프를 선택하면 3 레벨 트리가있는 경우 새 레벨 3 리프가 추가됩니다. level2 분기를 선택하면 새로운 level2 분기가 추가됩니다. 그것이하지 않는 것 : level2 브랜치에 새로운 level3 리프를 추가하지는 않지만, 다른 기능입니다. – DVarga

관련 문제