现在我的JTree去哪儿了。自定义UserObjects或其他方式来实现所需要的?

时间:2014-01-15 23:15:09

标签: java swing jtree

我有一个jTree,我从对象列表的toString方法填充节点。我在该列表中有大约10种不同类型的对象。

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

我也尝试将我的对象用作节点的 UserObject ,但是当我编辑名称时,它会将 UserObject 转换回 String < / p>

我该如何继续?

1 个答案:

答案 0 :(得分:2)

感谢大家,我设法解决了这个(希望)这个特殊JTree的最后一个问题。以下是我从THIS示例中执行此操作的方法:

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

Text,Real,Size等是填充节点的自定义对象。

修改  只是注意到Object objToChange = testNode.getUserObject();可能会返回一个TreeNode。所以我为此做了一个循环。