2012-07-19 39 views
3

編輯JTree節點時,節點的用戶對象丟失(設置爲字符串)。我如何獲得原始用戶對象?因爲我想獲取用戶對象的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 2012-07-19 06:46:29

+0

這是否意味着我可以在valueChanged而不是treeNodesChanged中調用數據庫更新? – Praveen 2012-07-19 06:56:25

+0

@Praveen'valueForPathChanged()'的'DefaultTreeModel'實現會調用'fireTreeNodesChanged',最終會在'treeNodesChanged'中結束。只要確保你不阻止Swing的數據庫訪問的'Event Dispatch Thread'。查看SwingWorker的冗長任務。 – tenorsax 2012-07-19 07:10:10