我正在使用从数据库填充的JTree。可编辑的JTree将树节点转换为字符串
树被这样设定根节点及其孩子的自定义对象创建:
private DefaultMutableTreeNode rootNode = new DefaultMutableTreeNode("Categorias");
...
ResultSet primaryCategories = dbm.fetchAllCategories();
while (primaryCategories.next()){
Category category = new Category(primaryCategories.getLong("_id"),
primaryCategories.getString("category"));
DefaultMutableTreeNode childNode = new DefaultMutableTreeNode(category);
rootNode.add(childNode);
ResultSet currentSubcategory = dbm.fetchChildSubcategories(category.getCatId());
while (currentSubcategory.next()){
Category subcategory = new Category(currentSubcategory.getLong("_id"),
currentSubcategory.getString("category"));
childNode.add(new DefaultMutableTreeNode(subcategory, false));
}
}
...
在此之后,是完全创建的树。填充“类别”对象,每个对象都有自己的ID号及其在toString()方法中使用的名称。
问题出现在设置可编辑时。一旦节点重命名,类别节点也转换为字符串对象,所以我不能更新新的类别名称值到数据库。
我试图用treeNodesChanged(TreeModelEvent e)
捕获重命名事件,但userObject已经更改为字符串对象,并且无法获得编辑对象的引用。
我该如何解决这个问题?我是否应该有显示的树的副本,以及从数据库下载的另一个副本,并在每次发生更改时都提供这两个树的副本?
* PD:* 我也试图捕捉从模型改变的节点覆盖方法:
public void nodeChanged(TreeNode newNode) {
DefaultMutableTreeNode parent = ((DefaultMutableTreeNode)newNode.getParent());
int index = getIndexOfChild(parent, newNode);
DefaultMutableTreeNode oldNode = (DefaultMutableTreeNode) getChild(parent, index);
System.out.println(parent.getUserObject().getClass().toString());
System.out.println(oldNode.getUserObject().getClass().toString());
}
此打印:
class com.giorgi.commandserver.entity.Category
class java.lang.String
所以这里的老节点已经被更改为一个字符串,我完全失去了对旧类别及其ID的引用,所以我无法在数据库中更新它。
任何帮助都是很好的。
感谢您的快速回复,我现在正在研究它 – giorgiline
非常感谢疯了你救了我的命。 – giorgiline
大声笑,从未在'JTree'中完成编辑,它很好地挖掘出它的工作原理:D – MadProgrammer