Earlier I asked how to fire an event when a TreeNode was renamed (here). My question was answered, but I ran into another problem. I need to access the TreeNode that is being edited in the CellEditorListener's editingStopped event. This is the code I have to do so:
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());
}
}
I get this error:
Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: javax.swing.tree.DefaultTreeCellEditor$1 cannot be cast to javax.swing.tree.DefaultTreeCellEditor
EDIT: In another attempt, I used this code in the 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());
}
and this code in the CustomTreeCellEditor
public TreePath getLastPath() {
return lastPath;
}
I got the same error (I expected I would). What I have should work, so the only real question remaining is, "Why am I getting the error and how can I fix it?," but if anyone has a better way to accomplish this, I'm willing to listen.
EDIT 2: I have made a small example of what I'm trying to accomplish that can be found here (It's an Eclipse archive).
It appears that you want to edit the name of a
Resource
in aDefaultMutableTreeNode
. As you've found, the source of theChangeEvent
sent toeditingStopped()
in not aDefaultTreeCellEditor
; it is the editor's (anonymous) UI delegate.Instead, override
getCellEditorValue()
in yourDefaultTreeCellEditor
, as shown below. TheDefaultTreeCellRenderer
simply callstoString()
, viaconvertValueToText()
, which accesses the user object ofDefaultMutableTreeNode
.Addenda: Note that
isCellEditable()
ensures that only leaf nodes can be edited.As @kleopatra notes in comments, the previous
TreeCellEditor
implementation was invalid, as it modified the node being edited. The revised version below creates a new node having the updated name; a copy constructor would be useful in this context. The advantage is that theuserObject
remains aResource
. See also this alternative approach.I found a solution that was actually very simple. When a TreeNode is renamed, it ends up being the only selected node in the tree. Because of that, I was able to use: