2011-07-26 3 views
3

은 노드의 표시 문자열을 선택적으로 변경할 수있는 DefaultMutableTreeNode의 재정의로 채워집니다. 아래 코드에서 볼 수 있듯이, 내 양식에서는 별도의 클래스에 트리를 작성한 다음 주 데이터 유형에 대한 래퍼 클래스를 통해 새 노드를 트리에 채 웁니다. 여기에 새로 재정의 된 DefaultMutableTreeNode을 새로 작성하여 그 노드에 자식을 추가 한 다음 (각 AccessPoint은 여러 자식 노드가있는 노드로 표시됨) 나중에 UI에 사용할 수 있도록 저장합니다.TreeModel이 새 노드를 추가 할 때 JTree가 업데이트되지 않는 이유는 무엇입니까?

처음으로이 방법으로 노드를 추가하면 멋지게 작동합니다. 다음 코드로 추가 된 모든 후속 노드는 사실 DefaultTreeModel에 저장되지만 JTree은 새 노드로 업데이트되지 않습니다.

첫 번째 자녀를 추가 한 후 JTree이 채워지지 않는 이유는 무엇입니까?

private void populateAccessPointTreeModel(AccessPointDataWrapper wrapper) { 
    //the pre-created DefaultMutableTreeNode subclass instance is 
    // stored in the wrapper 
    DefaultMutableTreeNode accessPointNode = 
      wrapper.getAccessPointTreeNode(); 
    //this line updates the accessPointTree with the new node (I've looked at the 
    // value in debug mode, and it does in fact add the node 
    ((DefaultMutableTreeNode) accessPointTree.getRoot()).add(accessPointNode); 
    //unrelated logic happens down here... 
} 

필요한 경우 노드를 만드는 코드를 포함 할 수 있지만 문제는 아닌 것 같습니다.

+0

구성 요소 또는 그 부모를 다시 페인트 해 보셨습니까? – Bitmap

답변

7

DefaultMutableTreeNode은 (는) DefaultTreeModel에 자식이 업데이트되었음을 ​​알리지 않습니다. 이렇게하려면 표 모델 (nodesChanged 또는 그와 비슷한)에서 적절한 메소드를 호출하거나 (바람직하게는) DefaultTreeModel.insertNodesInto 메소드를 사용하는 것이 좋습니다.

DefaultTreeModel model = (DefaultTreeModel)accessPointTree.getModel(); 
DefaultMutableTreeNode root = model.getRoot(); 
model.insertNodeInto(accessPointNode, root, root.getChildCount()); 
+0

+1, Swing comopnents에 대한 업데이트는 항상 모델을 사용하여 수행해야합니다. – camickr

+0

그건 의미가 있습니다. 이전에 UI 클래스에 저장 한 DefaultTreeModel을 통해 업데이트했지만, ShortMutableTreeNode에 추가 기능을 사용하여 종료했습니다. 감사. –

+0

나는 root.getChildCount()가 insertNodeInto에서 예외를 벗어난 예외를 던질 것이라고 믿는다. 스레드 "알고리즘 스레드"에서의 예외 java.lang.ArrayIndexOutOfBoundsException : 1> 0 at java.util.Vector.insertElementAt (Vector.java:571) at javax.swing.tree.DefaultMutableTreeNode.insert (DefaultMutableTreeNode.java:195)) at javax.swing.tree.DefaultTreeModel.insertNodeInto (DefaultTreeModel.java:234) –

0

스레딩 문제가있을 가능성이 큽니다. JTree는 일부 스레드로 업데이트되지만 Swing 이벤트 발송 스레드 (EDT)에 표시되는 JTree의 중요한 사본에는 변경 내용이 없습니다. 이 경우

, 사용 스윙 EDT에서의 JTree를 업데이트 할 필요가 ...

SwingUtilities.invokeLater(new Runnable() { 
    @Override public void run() { ... update jTree here } 
}); 

내가 JTree가 모르는, 어쩌면 당신이 스윙에 업데이트해야하는하는 TreeModel의 EDT.