【问题标题】:A editable JTree converts the tree nodes into Strings可编辑的 JTree 将树节点转换为字符串
【发布时间】:2012-10-01 11:41:00
【问题描述】:

我正在使用从数据库填充的 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));
    }
}
...

在此之后,树就完美创建了。填充了“Category”对象,每个对象都有自己的 ID 号和要在 toString() 方法中使用的名称。

当它设置为可编辑时,问题就来了。重命名节点后,Category 节点也转换为 String 对象,因此我无法将新的 Category 名称值更新到数据库中。

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

欢迎任何帮助。

【问题讨论】:

    标签: java swing jtree


    【解决方案1】:

    好的,这需要一些挖掘。

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

    大概,您使用的是默认编辑器或基于文本字段的编辑器。这将返回一个String 值。

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

    【讨论】:

    • 感谢您的快速回答,我会马上调查的
    • 大声笑,从未在JTree 中进行过编辑,可以四处挖掘以了解其工作原理:D
    【解决方案2】:

    最终的解决方案就像 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);
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-01
      • 1970-01-01
      • 2011-08-28
      • 2013-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-06
      相关资源
      最近更新 更多