2012-06-05 1 views
0

사용자 개체 및 사용자 지정 모델이있는 JTree가 있습니다. 어느 시점에서 노드를 선택하고 그럴 때 새로운 검색된 데이터로 트리를 업데이트합니다. 그런 일이 발생하면 트리를 거쳐 선택된 노드를 찾아 새 노드로 대체합니다 (최신). 찾으면 부모에서 이전 노드를 제거하고 새 노드를 해당 위치에 추가하고 nodeChanged (newNode)를 호출합니다. 트리가 업데이트됩니다. 새 노드가 업데이트 된 컨텐츠와 함께 나타납니다.모델 업데이트시 JTree에서 selectionPaths 업데이트

문제는이 트리 업데이트에서 돌아 오면 선택 경로가 업데이트되지 않았기 때문에 getSelectionPaths() 메서드를 사용하면 반환 노드 (하나의 노드 만 선택됨)가 이전 노드에 해당합니다. 나무에서 제거되었습니다.

새롭게 업데이트 된 모델로 선택 경로를 업데이트하려면 어떻게해야합니까?

+1

빨리 더 도움 들어, [SSCCE] (http://sscce.org/)를 게시 :

나는 노드의 한 단계를 가지는 JTree의 리프를 선택하는 예를했다. –

답변

3

새 TreePath를 만들고 새 경로로 setSelectedPath를 호출 할 수 있습니다. 그러나 더 나은 방법은 노드를 제거하는 대신 변경 가능하게 만들고 노드를 업데이트하는 것입니다. 이렇게하면 트리 모델이 변경되지 않고 선택 경로가 변경되지 않습니다.

또한 적절한 이벤트를 발생시켜야합니다 (노드가 제거되거나 추가되는 대신 노드가 변경됨).

0

리프의 새 경로를 찾을 수있는 경우 TreePath을 만들 수 있습니다.

public JTree    fileTree; 
public void setJTreePath(String leafName, String nodeName) { 

    TreeNode root = (TreeNode) fileTree.getModel().getRoot(); 
    TreePath path = new TreePath(root); 
    int rootChildCount = root.getChildCount(); 
    mainLoop: 
    for (int i = 0; i < rootChildCount; i++) { 

     TreeNode child = root.getChildAt(i); 
     if (child.toString().equals(nodeName)) { 
      path = path.pathByAddingChild(child); 
      int ChildCount = child.getChildCount(); 
      for (int j = 0; j < ChildCount; j++) { 
       TreeNode child2 = child.getChildAt(j); 
       if (child2.toString().equals(leafName)) { 
        path = path.pathByAddingChild(child2); 
        fileTree.setSelectionPath(path); 

        //I've used a SwingUtilities here, maybe it's not mandatory 
        SwingUtilities.invokeLater(
          new Runnable() { 
           @Override 
           public void run() { 
            fileTree.scrollPathToVisible(fileTree.getSelectionPath()); 
           } 
          }); 
        break mainLoop; 
       } 
      } 
     } 
    } 
}