【发布时间】:2012-10-01 11:41:00
【问题描述】:
我正在使用从数据库填充的 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));
}
}
...
在此之后,树就完美创建了。填充了“Category”对象,每个对象都有自己的 ID 号和要在 toString() 方法中使用的名称。
当它设置为可编辑时,问题就来了。重命名节点后,Category 节点也转换为 String 对象,因此我无法将新的 Category 名称值更新到数据库中。
我尝试使用 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 的引用,因此我无法在数据库中更新它。
欢迎任何帮助。
【问题讨论】: