It seems you want to change the Resource name to DefaultMutableTreeNode . As you found, the ChangeEvent source ChangeEvent sent to editingStopped() not in DefaultTreeCellEditor ; this is an editor (anonymous) user interface delegate.
Instead, override getCellEditorValue() in DefaultTreeCellEditor , as shown below. DefaultTreeCellRenderer simply calls toString() via convertValueToText() , which accesses the user object DefaultMutableTreeNode .
Applications: note that isCellEditable() guarantees that only leaf nodes are edited.
As @kleopatra notes in the comments, the previous implementation of TreeCellEditor was invalid because it modified the editable node. In the version below, a new node is created with the updated name; A copy constructor would be useful in this context. The advantage is that userObject remains a Resource . See also this alternative approach .

public class TreeEditDemo extends JPanel { private JTree tree; private DefaultMutableTreeNode root; private DefaultTreeCellEditor editor; private JLabel label = new JLabel(" ", JLabel.CENTER); public TreeEditDemo() { super(new BorderLayout()); root = new DefaultMutableTreeNode("Nodes"); root.add(new DefaultMutableTreeNode(new Resource("one"))); root.add(new DefaultMutableTreeNode(new Resource("two"))); root.add(new DefaultMutableTreeNode(new Resource("three"))); final DefaultTreeModel treeModel = new DefaultTreeModel(root); tree = new JTree(treeModel); tree.setEditable(true); editor = new MyTreeCellEditor(tree, (DefaultTreeCellRenderer) tree.getCellRenderer()); tree.setCellEditor(editor); tree.getInputMap().put( KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0), "startEditing"); this.add(new JScrollPane(tree)); this.add(label, BorderLayout.SOUTH); tree.addTreeSelectionListener(new TreeSelectionListener() { @Override public void valueChanged(TreeSelectionEvent e) { TreePath path = e.getNewLeadSelectionPath(); if (path != null) { DefaultMutableTreeNode node = (DefaultMutableTreeNode) path.getLastPathComponent(); if (node.isLeaf()) { Resource user = (Resource) node.getUserObject(); label.setText(user.toString()); } else { label.setText(" "); } } } }); editor.addCellEditorListener(new CellEditorListener() { @Override public void editingStopped(ChangeEvent e) { label.setText(editor.getCellEditorValue().toString()); } @Override public void editingCanceled(ChangeEvent e) { } }); } private static class MyTreeCellEditor extends DefaultTreeCellEditor { public MyTreeCellEditor(JTree tree, DefaultTreeCellRenderer renderer) { super(tree, renderer); } @Override public Object getCellEditorValue() { String value = (String) super.getCellEditorValue(); return new Resource(value); } @Override public boolean isCellEditable(EventObject e) { return super.isCellEditable(e) && ((TreeNode) lastPath.getLastPathComponent()).isLeaf(); } } private static class Resource { String name; public Resource(String name) { this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return getName(); } } private void display() { JFrame f = new JFrame("TreeEditorDemo"); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.add(this); f.pack(); f.setLocationRelativeTo(null); f.setVisible(true); } public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { @Override public void run() { new TreeEditDemo().display(); } }); } }
source share