2012-10-10 115 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); 
    }