Java 可编辑的JTree将树节点转换为字符串
我使用的是从数据库填充的JTree 通过将根节点及其子节点设置为自定义对象来创建树,方法如下:Java 可编辑的JTree将树节点转换为字符串,java,swing,jtree,Java,Swing,Jtree,我使用的是从数据库填充的JTree 通过将根节点及其子节点设置为自定义对象来创建树,方法如下: private DefaultMutableTreeNode rootNode = new DefaultMutableTreeNode("Categorias"); ... ResultSet primaryCategories = dbm.fetchAllCategories(); while (primaryCategories.next()){ Category category =
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已更改为String对象,无法获取编辑对象的引用
我能用什么方法解决这个问题?我是否应该有一个显示的树的副本和另一个从数据库下载的副本,并在每次发生更改时都进行升级
*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的引用,因此无法在数据库中更新它
任何帮助都会随之而来。最终解决方案正如程序员所说的那样:
public void valueForPathChanged(TreePath path, Object newValue) {
DefaultMutableTreeNode aNode = (DefaultMutableTreeNode)path.getLastPathComponent();
Category catNode = (Category) aNode.getUserObject();
catNode.setCategory((String) newValue);
catNode.updateFromDatabase();
nodeChanged(aNode);
}
最终的解决方案正如程序员所说的那样:
public void valueForPathChanged(TreePath path, Object newValue) {
DefaultMutableTreeNode aNode = (DefaultMutableTreeNode)path.getLastPathComponent();
Category catNode = (Category) aNode.getUserObject();
catNode.setCategory((String) newValue);
catNode.updateFromDatabase();
nodeChanged(aNode);
}
好吧,这需要一点挖掘 基本上,当编辑被“停止”时,
JTree
将通过编辑器的getCellEditorValue
请求编辑器的值。然后通过valuesForPathChanged
方法将其传递给模型,该方法最终调用节点的setUserObject
方法
您可能正在使用默认编辑器或基于文本字段的编辑器。这将返回一个字符串
值
您需要做的是捕获对树节点的
setUserObject
方法的更改,访问即将到来的值(即,检查它是否是字符串
),并根据需要进行更新。好的,这需要一些挖掘
基本上,当编辑被“停止”时,JTree
将通过编辑器的getCellEditorValue
请求编辑器的值。然后通过valuesForPathChanged
方法将其传递给模型,该方法最终调用节点的setUserObject
方法
您可能正在使用默认编辑器或基于文本字段的编辑器。这将返回一个字符串
值
您需要做的是捕获对树节点的
setUserObject
方法的更改,访问即将到来的值(即,检查它是否是字符串
),并根据需要进行更新。感谢您的快速回答,我将立即查看它lol,从未在JTree
中完成编辑,仔细研究它是如何工作的很好:D谢谢你的快速回答,我现在就开始研究。LOL,从未在JTree
中编辑过,仔细研究它是如何工作的很好:D