我有一个jTree,我从对象列表的toString方法填充节点。我在该列表中有大约10种不同类型的对象。
我在更改节点名称时遇到问题。通常,当我需要到达节点的对象时,我在 List 中搜索 node.toString()以找出对象在列表中的位置,所以我可以做 myList.get(i)。但是当我更改节点名称时,它不会在List中找到任何内容,因为它不会更新对象名称。在更改节点名称之前,我找不到保存旧名称的方法。
我也尝试将我的对象用作节点的 UserObject ,但是当我编辑名称时,它会将 UserObject 转换回 String < / p>
我该如何继续?
答案 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。所以我为此做了一个循环。