2012-10-10 73 views
1

我正在使用從數據庫填充的JTree。可編輯的JTree將樹節點轉換爲字符串

樹被這樣設定根節點及其孩子的自定義對象創建:

private DefaultMutableTreeNode rootNode = new DefaultMutableTreeNode("Categorias"); 
... 
ResultSet primaryCategories = dbm.fetchAllCategories(); 
while (primaryCategories.next()){ 
    Category category = new Category(primaryCategories.getLong("_id"), 
      primaryCategories.getString("category")); 
    DefaultMutableTreeNode childNode = new DefaultMutableTreeNode(category); 
    rootNode.add(childNode); 

    ResultSet currentSubcategory = dbm.fetchChildSubcategories(category.getCatId()); 
    while (currentSubcategory.next()){ 
     Category subcategory = new Category(currentSubcategory.getLong("_id"), 
       currentSubcategory.getString("category")); 
     childNode.add(new DefaultMutableTreeNode(subcategory, false)); 
    } 
} 
... 

在此之後,是完全創建的樹。填充「類別」對象,每個對象都有自己的ID號及其在toString()方法中使用的名稱。

問題出現在設置可編輯時。一旦節點重命名,類別節點也轉換爲字符串對象,所以我不能更新新的類別名稱值到數據庫。

我試圖用treeNodesChanged(TreeModelEvent e)捕獲重命名事件,但userObject已經更改爲字符串對象,並且無法獲得編輯對象的引用。

我該如何解決這個問題?我是否應該有顯示的樹的副本,以及從數據庫下載的另一個副本,並在每次發生更改時都提供這兩個樹的副本?

* PD:* 我也試圖捕捉從模型改變的節點覆蓋方法:

public void nodeChanged(TreeNode newNode) { 
    DefaultMutableTreeNode parent = ((DefaultMutableTreeNode)newNode.getParent()); 
    int index = getIndexOfChild(parent, newNode); 
    DefaultMutableTreeNode oldNode = (DefaultMutableTreeNode) getChild(parent, index); 
    System.out.println(parent.getUserObject().getClass().toString()); 
    System.out.println(oldNode.getUserObject().getClass().toString());   
} 

此打印:

class com.giorgi.commandserver.entity.Category 
class java.lang.String 

所以這裏的老節點已經被更改爲一個字符串,我完全失去了對舊類別及其ID的引用,所以我無法在數據庫中更新它。

任何幫助都是很好的。

回答

3

好了,挖了一個位。

基本上,當編輯處於「停止」狀態時,JTree將通過編輯器getCellEditorValue請求編輯器的值。然後通過valuesForPathChanged方法傳遞給模型,該方法最終調用節點的setUserObject方法。

大概,您使用的是默認編輯器或基於文本字段。這將返回一個String值。

您需要做的是將更改捕獲到樹節點的setUserObject方法,訪問值(即檢查是否爲String)並根據需要進行更新。

+0

感謝您的快速回復,我現在正在研究它 – giorgiline

+0

非常感謝瘋了你救了我的命。 – giorgiline

+0

大聲笑,從未在'JTree'中完成編輯,它很好地挖掘出它的工作原理:D – MadProgrammer

1

最終的解決方案是爲MadProgrammer據說得到它:

public void valueForPathChanged(TreePath path, Object newValue) { 
     DefaultMutableTreeNode aNode = (DefaultMutableTreeNode)path.getLastPathComponent(); 
     Category catNode = (Category) aNode.getUserObject(); 
     catNode.setCategory((String) newValue); 
     catNode.updateFromDatabase(); 
     nodeChanged(aNode); 
    }