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