Java 我现在要带着我的树去哪里。自定义用户对象或其他实现所需功能的方法?

Java 我现在要带着我的树去哪里。自定义用户对象或其他实现所需功能的方法?,java,swing,jtree,Java,Swing,Jtree,我有一个jTree,通过对象列表的toString方法填充节点。在这个列表中,我有大约10种不同的对象 我在更改节点名称时遇到问题。通常,当我需要访问某个节点的对象时,我会在列表中搜索node.toString()以找出该对象在列表中的位置,这样我就可以执行myList.get(I)。但是当我更改节点名称时,它在列表中找不到任何内容,因为它不会更新对象名称。在更改节点名称之前,我找不到保存旧名称的方法 我还尝试将我的对象用作节点的UserObject,但当我编辑名称时,它会将UserObject

我有一个jTree,通过对象列表的toString方法填充节点。在这个列表中,我有大约10种不同的对象

我在更改节点名称时遇到问题。通常,当我需要访问某个节点的对象时,我会在列表中搜索node.toString()以找出该对象在列表中的位置,这样我就可以执行myList.get(I)。但是当我更改节点名称时,它在列表中找不到任何内容,因为它不会更新对象名称。在更改节点名称之前,我找不到保存旧名称的方法

我还尝试将我的对象用作节点的UserObject,但当我编辑名称时,它会将UserObject转换回字符串


我该如何继续?

多亏了大家,我终于用这个特别的JTree解决了最后一个问题(希望如此)。下面是我如何从示例中实现的:

文本、实数、大小等是填充节点的自定义对象

编辑:
刚刚注意到
objectobjtochange=testNode.getUserObject()可能返回一个树节点。因此,我为此设置了一个while循环。

不要依赖于
toString
,更多地依赖于
DefaultMutableTreeNode
userObject
属性,并将实际对象从列表传递给它,这样就可以在两个组件之间使用实际对象引用。然后依靠
JTree
的自定义渲染来渲染希望在屏幕上显示的实际值。更多信息,请仔细查看details@MadProgrammer我确实看了一下,但我似乎无法理解当我开始从UI编辑节点时,它会发生什么。当我3次单击并给它一个新名称时,它会再次将其userobject更改为String。例如,在仔细研究之后,当更改节点值时,将调用
TableModel#valueForPathChanged
方法,该方法设置节点用户对象。你(至少)有两个选择。作为一个自定义编辑器提供,它知道如何编辑原始对象并返回它(其中存储了新的“显示”值),或者更改
valueForPathChanged
方法以适应您的需要。就我个人而言,我会选择door#1(自定义编辑器)@MadProgrammer我应该做的
MyTreeCellEditor扩展DefaultTreeCellEditor
,并正确地构建和使用它,对吗?你做了一个很好的选择。谢谢你的回复+1.
  private static class MyTreeCellEditor extends DefaultTreeCellEditor {

        public MyTreeCellEditor(JTree tree, DefaultTreeCellRenderer renderer) {
            super(tree, renderer);
        }
        Text newText;
        Real newReal;
        Size newSize;
        Integer newInt;
        Boolean newBool;
        Table newTable;

        @Override
        public Component getTreeCellEditorComponent(JTree jtree, Object o, boolean bln, boolean bln1, boolean bln2, int i) {
            return super.getTreeCellEditorComponent(jtree, o, bln, bln1, bln2, i); //To change body of generated methods, choose Tools | Templates.
        }

    @Override
    public Object getCellEditorValue() {
        String value = (String) super.getCellEditorValue();
        DefaultMutableTreeNode testNode = (DefaultMutableTreeNode) super.tree.getLastSelectedPathComponent();

        Object objToChange = testNode.getUserObject();

        while (objToChange instanceof DefaultMutableTreeNode) {
            DefaultMutableTreeNode parentNode = (DefaultMutableTreeNode) objToChange;
            objToChange = parentNode.getUserObject();
        }

        if (testNode.getChildCount() > 0) {
            value += " (" + testNode.getChildCount() + ")";
        }

        if (objToChange instanceof Text) {
            newText = (Text) objToChange;
            newText.setName(value);
            return newText;
        } else if (objToChange instanceof Real) {
            newReal = (Real) objToChange;
            newReal.setName(value);
            return newReal;
        } else if (objToChange instanceof Size) {
            newSize = (Size) objToChange;
            newSize.setName(value);
            return newSize;
        } else if (objToChange instanceof Integer) {
            newInt = (Integer) objToChange;
            newInt.setName(value);
            return newInt;
        } else if (objToChange instanceof Boolean) {
            newBool = (Boolean) objToChange;
            newBool.setName(value);
            return newBool;
        } else if (objToChange instanceof Table) {
            newTable = (Table) objToChange;
            newTable.setName(value);
            return newTable;
        } else {
            return new Text("unexpected object 02");
        }
    }