【问题标题】:JTree node rename preserve user objectJTree节点重命名保留用户对象
【发布时间】:2012-07-19 05:41:53
【问题描述】:

编辑 JTree 节点时,该节点的用户对象会丢失(设置为字符串)。如何获取原始用户对象?因为我想获取用户对象的 id 以便更新数据库中编辑的名称。

我正在使用 TreeModelListener 的 treeNodesChanged 方法,如下所示。

public void treeNodesChanged(TreeModelEvent e) {
    DefaultMutableTreeNode node;
    node = (DefaultMutableTreeNode) (e.getTreePath().getLastPathComponent());
    try {
        int index = e.getChildIndices()[0];
        node = (DefaultMutableTreeNode) (node.getChildAt(index));
    } catch (NullPointerException ex) {}        
    System.out.println(node.getUserObject().getClass()); // my user object gone
}

那么有什么方法可以在编辑之前获取原始用户对象?是否有要覆盖的 DefaultTreeCellRenderer 或 DefaultTreeCellEditor 方法?

【问题讨论】:

    标签: java swing jtree


    【解决方案1】:

    实现TreeModel.valueForPathChanged()。或者如果您使用的是DefaultTreeModel,则覆盖DefaultTreeModel.valueForPathChanged()。这是设置新用户对象的地方,它使您有机会访问原始用户对象。

    【讨论】:

    • 谢谢它的工作。我用DefaultTreeModel.valueForPathChanged()Object obj = ((DefaultMutableTreeNode)path.getLastPathComponent()).getUserObject(); ((MyClass)obj).setName(newValue.toString()); super.valueForPathChanged(path, obj); 然后在 treeNodesChanged 中,我可以获取更改值的用户对象。
    • 是不是可以在valueChanged而不是treeNodesChanged中调用数据库更新?
    • @Praveen DefaultTreeModel 的实现valueForPathChanged() 将调用fireTreeNodesChanged,最终将在treeNodesChanged 中结束。只要确保您没有阻止 Swing 的 Event Dispatch Thread 访问数据库即可。查看 SwingWorker 以完成冗长的任务。
    猜你喜欢
    • 1970-01-01
    • 2011-08-06
    • 2011-10-03
    • 2016-11-17
    • 2017-03-27
    • 1970-01-01
    • 1970-01-01
    • 2018-06-13
    • 2014-04-13
    相关资源
    最近更新 更多