当前位置: 首页 > 知识库问答 >
问题:

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

岳意蕴
2023-03-14

我使用的是从数据库填充的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()方法中使用。

当它被设置为可编辑时,问题就来了。一旦节点被重命名,类别节点也被转换成一个字符串对象,所以我不能更新新的类别名称值到数据库

我试图用treeNodeChanged(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的引用,所以我不能在数据库中更新它。

任何帮助都会来的。

共有2个答案

经和歌
2023-03-14

最后的解决方案是,就像疯狂程序员说的那样:

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);
    }
尹小云
2023-03-14

好吧,那需要一点挖掘。

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

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

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

 类似资料:
  • 问题内容: 我想在GO中将字符串数组转换为字节数组,以便可以将其写到磁盘上。将字符串数组()解码为字节数组()的最佳解决方案是什么? 我正在考虑对字符串数组进行两次迭代,第一个迭代以获得字节数组所需的实际大小,然后第二个迭代写入每个元素的长度和实际字符串()。 解决方案必须能够以其他方式进行转换;从一个到一个。 问题答案: 让我们忽略一个事实,那就是走一秒钟。您需要做的第一件事是将序列化格式编组为

  • 问题内容: 我正在使用以下代码从外部程序获取标准输出: 方法返回一个字节数组: 但是,我想将输出作为普通的字符串使用。这样我就可以像这样打印它: 我认为这就是方法的用途,但是当我尝试使用它时,我又得到了相同的字节数组: 如何将字节值转换回字符串?我的意思是,使用”batteries”而不是手动进行操作。我希望它与Python 3兼容。 问题答案: 你需要解码bytes对象以产生一个字符串:

  • 问题内容: 我有一个必须解析的二进制文件,并且正在使用Python。有没有办法占用4个字节并将其转换为单个精度浮点数? 问题答案:

  • 问题内容: 您好,我正在从Web服务获取一个字符串。 我需要解析此字符串并获取错误消息中的文本? 我的字符串如下所示: 仅分析字符串还是将其转换为xml然后进行分析是否更好? 问题答案: 我将使用Java的XML文档库。有点混乱,但是可以。

  • 如何将字符串(字节字符串)转换为字节(字节字符串),而不必手动复制和粘贴字符串并在其前面放置b?