Java 可编辑的JTree将树节点转换为字符串

Java 可编辑的JTree将树节点转换为字符串,java,swing,jtree,Java,Swing,Jtree,我使用的是从数据库填充的JTree 通过将根节点及其子节点设置为自定义对象来创建树,方法如下: private DefaultMutableTreeNode rootNode = new DefaultMutableTreeNode("Categorias"); ... ResultSet primaryCategories = dbm.fetchAllCategories(); while (primaryCategories.next()){ Category category =

我使用的是从数据库填充的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已更改为String对象,无法获取编辑对象的引用

我能用什么方法解决这个问题?我是否应该有一个显示的树的副本和另一个从数据库下载的副本,并在每次发生更改时都进行升级

*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的引用,因此无法在数据库中更新它


任何帮助都会随之而来。

最终解决方案正如程序员所说的那样:

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);
    }

最终的解决方案正如程序员所说的那样:

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);
    }

好吧,这需要一点挖掘

基本上,当编辑被“停止”时,
JTree
将通过编辑器的
getCellEditorValue
请求编辑器的值。然后通过
valuesForPathChanged
方法将其传递给模型,该方法最终调用节点的
setUserObject
方法

您可能正在使用默认编辑器或基于文本字段的编辑器。这将返回一个
字符串


您需要做的是捕获对树节点的
setUserObject
方法的更改,访问即将到来的值(即,检查它是否是
字符串
),并根据需要进行更新。

好的,这需要一些挖掘

基本上,当编辑被“停止”时,
JTree
将通过编辑器的
getCellEditorValue
请求编辑器的值。然后通过
valuesForPathChanged
方法将其传递给模型,该方法最终调用节点的
setUserObject
方法

您可能正在使用默认编辑器或基于文本字段的编辑器。这将返回一个
字符串


您需要做的是捕获对树节点的
setUserObject
方法的更改,访问即将到来的值(即,检查它是否是
字符串
),并根据需要进行更新。

感谢您的快速回答,我将立即查看它lol,从未在
JTree
中完成编辑,仔细研究它是如何工作的很好:D谢谢你的快速回答,我现在就开始研究。LOL,从未在
JTree
中编辑过,仔细研究它是如何工作的很好:D