java从CellEditorListener获取编辑的TreeNode
早些时候,我问如何在树节点被重命名(here)时触发事件。我的问题得到了回答,但我遇到了另一个问题。我需要访问CellEditorListener的editingStopped事件中正在编辑的TreeNode。这是我必须执行的代码:
package com.gamecreator;
import javax.swing.event.CellEditorListener;
import javax.swing.event.ChangeEvent;
import javax.swing.tree.DefaultTreeCellEditor;
public class CustomCellEditorListener implements CellEditorListener {
public CustomCellEditorListener() {
}
public void editingCanceled(ChangeEvent e) {
}
public void editingStopped(ChangeEvent e) {
DefaultTreeCellEditor editor = (DefaultTreeCellEditor) e.getSource(); //This gives me the error.
CustomTreeNode node = //What do I put here???;
node.getResource().setName((String) node.getUserObject());
//For debugging
System.out.println(node.getResource().getName());
}
}
我得到这个错误:
Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: javax.swing.tree.DefaultTreeCellEditor$1 cannot be cast to javax.swing.tree.DefaultTreeCellEditor
编辑: 在另一次尝试中,我在CustomCellEditorListener中使用了此代码
public void editingStopped(ChangeEvent e) {
TreePath path = ((CustomTreeCellEditor) e.getSource()).getLastPath(); //This gives me the error.
CustomTreeNode node = (CustomTreeNode) path.getLastPathComponent();
node.getResource().setName((String) node.getUserObject());
//For debugging
System.out.println(node.getResource().getName());
}
以及CustomTreeCeleditor中的此代码
public TreePath getLastPath() {
return lastPath;
}
我也犯了同样的错误(我想我会的)。我所拥有的应该是有效的,所以剩下的唯一真正的问题是,“为什么我会出现错误,我怎样才能纠正它?”但是如果有人有更好的方法来完成这一点,我愿意倾听
编辑2: 我已经做了一个小例子,说明我正在努力实现的目标,可以在here中找到(这是一个Eclipse归档文件)
# 1 楼答案
我找到了一个非常简单的解决方案。重命名TreeNode后,它将成为树中唯一选定的节点。因此,我能够使用:
# 2 楼答案
似乎您想在
DefaultMutableTreeNode
中编辑Resource
的名称。正如您所发现的,ChangeEvent
发送到editingStopped()
in而不是aDefaultTreeCellEditor
的来源;它是编辑器的(匿名)UI委托相反,在} 调用
DefaultTreeCellEditor
中重写getCellEditorValue()
,如下所示。DefaultTreeCellRenderer
只是通过^{toString()
,后者访问DefaultMutableTreeNode
的用户对象附录:注意
isCellEditable()
确保只有叶节点可以编辑正如@kleopatra在评论中指出的那样,之前的
TreeCellEditor
实现是无效的,因为它修改了正在编辑的节点。下面的修订版本创建了一个具有更新名称的新节点;在这方面copy constructor将是有用的。优点是userObject
仍然是Resource
。另见本alternative approach