Search code examples
javaswingjtree

TreeCellEditor perform Action after cell was edited


I want to perform an action after the CellEditor disappears. Which method gets invoked after that, where to start?


Solution

  • You have to listen to the JTree's CellEditor by adding CellEditorListener to the tree

     tree.getCellEditor().addCellEditorListener(new CellEditorListener() {
    
            @Override
            public void editingStopped(ChangeEvent e) {
                System.out.println(((DefaultCellEditor)e.getSource()).getCellEditorValue());
            }
    
            @Override
            public void editingCanceled(ChangeEvent e) {
                 System.out.println(((DefaultCellEditor)e.getSource()).getCellEditorValue());
            }
        });
    

    Full Example

      JFrame frame = new JFrame();
    
        //Mock data
        DefaultMutableTreeNode root = new DefaultMutableTreeNode("Root");
        for (int i = 1; i < 5; i++) {
            DefaultMutableTreeNode parent = new DefaultMutableTreeNode("Parent" + i);
            for (int j = 1; j < 5; j++) {
                parent.add(new DefaultMutableTreeNode("Child" + j));
            }
            root.add(parent);
        }
    
        DefaultTreeModel tmodel = new DefaultTreeModel(root);
        JTree tree = new JTree(tmodel);
    
        tree.setEditable(true);//To enable editing
    
        tree.getCellEditor().addCellEditorListener(new CellEditorListener() {
    
            @Override
            public void editingStopped(ChangeEvent e) {
                //add you code here
                System.out.println(((DefaultCellEditor) e.getSource()).getCellEditorValue());
            }
    
            @Override
            public void editingCanceled(ChangeEvent e) {
                //add you code here too
                System.out.println(((DefaultCellEditor) e.getSource()).getCellEditorValue());
            }
        });
        frame.add(new JScrollPane(tree));
    
        frame.setTitle("Tree Editor Example");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setVisible(true);