2012-07-19 1 views
3

JTree 노드를 편집하면 노드의 사용자 객체가 손실됩니다 (String으로 설정 됨). 원래 사용자 객체를 얻으려면 어떻게해야합니까? 왜냐하면 데이터베이스에서 편집 된 이름을 업데이트하기 위해 사용자 객체의 ID를 얻고 싶기 때문입니다.JTree 노드 이름 변경 보존 사용자 객체

아래와 같이 TreeModelListener의 treeNodesChanged 메소드를 사용하고 있습니다.

public void treeNodesChanged(TreeModelEvent e) { 
    DefaultMutableTreeNode node; 
    node = (DefaultMutableTreeNode) (e.getTreePath().getLastPathComponent()); 
    try { 
     int index = e.getChildIndices()[0]; 
     node = (DefaultMutableTreeNode) (node.getChildAt(index)); 
    } catch (NullPointerException ex) {}   
    System.out.println(node.getUserObject().getClass()); // my user object gone 
} 

그래서 편집하기 전에 원래 사용자 개체를 얻을 수있는 방법은 무엇입니까? DefaultTreeCellRenderer 또는 DefaultTreeCellEditor 메서드를 재정의하려면 어떻게해야합니까?

답변

4

TreeModel.valueForPathChanged()을 구현하십시오. DefaultTreeModel을 사용하는 경우 DefaultTreeModel.valueForPathChanged()을 재정의하십시오. 새 사용자 객체가 설정된 곳이며 원래 사용자 객체에 접근 할 수있는 기회를 제공합니다.

+0

감사합니다. [DefaultTreeModel.valueForPathChanged()] (http://docs.oracle.com/javase/6/docs/api/javax/swing/tree/DefaultTreeModel.html#valueForPathChanged%28javax.swing.tree.TreePath,%20java)를 사용했습니다. .lang.Object % 29). 'Object obj = ((DefaultMutableTreeNode) path.getLastPathComponent()). getUserObject(); ((MyClass) obj) .setName (newValue.toString()); super.valueForPathChanged (path, obj);'그런 다음 treeNodesChanged에서 변경된 값으로 사용자 객체를 가져올 수 있습니다. – Praveen

+0

treeNodesChanged가 아닌 valueChanged에서 데이터베이스 업데이트를 호출 할 수 있습니까? – Praveen

+0

@Praveen'DefaultTreeModel'의'valueForPathChanged()'구현은'treeNodesChanged'에서 결국'fireTreeNodesChanged'를 호출 할 것입니다. Swing의'Event Dispatch Thread'를 데이터베이스 액세스로 막지 않도록하십시오. 오랜 시간 동안 SwingWorker를 살펴보십시오. – tenorsax