Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-6511448

BasicTreeUI throws NPE if the editing node is removed by the model

    XMLWordPrintable

Details

    • Bug
    • Resolution: Cannot Reproduce
    • P4
    • None
    • 6
    • client-libs

    Description

      FULL PRODUCT VERSION :
      1.6.0-rc-b104

      ADDITIONAL OS VERSION INFORMATION :
      Microsoft Windows XP [Version 5.1.2600]

      A DESCRIPTION OF THE PROBLEM :
      BasicTreeUI.completeEditing(...) gets called as a result of a node being removed from the TreeModel. If the removed node is the editing node, an NPE is thrown because the editingBounds returned by getPathBounds() is null (because the node has already been removed).

      STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
      Create a JTree with some nodes. Click on a node to start editing it. Programmatically delete the node while it is being edited.

      EXPECTED VERSUS ACTUAL BEHAVIOR :
      EXPECTED -
      The node disappears with no exception thrown.
      ACTUAL -
      The node disappears, but an exception is thrown.

      ERROR MESSAGES/STACK TRACES THAT OCCUR :
      java.lang.NullPointerException
      at javax.swing.plaf.basic.BasicTreeUI.completeEditing(BasicTreeUI.java:1989)
      at javax.swing.plaf.basic.BasicTreeUI.completeEditing(BasicTreeUI.java:1954)
      at javax.swing.plaf.basic.BasicTreeUI$Handler.valueChanged(BasicTreeUI.java:3566)
      at javax.swing.tree.DefaultTreeSelectionModel.fireValueChanged(DefaultTreeSelectionModel.java:629)
      at javax.swing.tree.DefaultTreeSelectionModel.notifyPathChange(DefaultTreeSelectionModel.java:1078)
      at javax.swing.tree.DefaultTreeSelectionModel.removeSelectionPaths(DefaultTreeSelectionModel.java:497)
      at javax.swing.JTree.removeDescendantSelectedPaths(JTree.java:3095)
      at javax.swing.JTree.removeDescendantSelectedPaths(JTree.java:3145)
      at javax.swing.JTree$TreeModelHandler.treeNodesRemoved(JTree.java:3229)
      at com.aquaminds.noteshare.ui.swing.EntryTreeModel.fireEntriesRemoved(EntryTreeModel.java:324)


      REPRODUCIBILITY :
      This bug can be reproduced always.

      ---------- BEGIN SOURCE ----------
      import java.util.*;
      import java.awt.*;
      import javax.swing.*;
      import javax.swing.tree.*;

      // This example throws a NulPointerException when the child entry is removed from the TreeModel while it is being edited.
      // The bug is dependent on having a custom TreeCellEditor such as the one below.

      public class BadJTree {

      class CellEditor extends AbstractCellEditor implements TreeCellRenderer, TreeCellEditor {
      private JTextPane textPane;
      Object editorValue;

      public CellEditor() {
      super();
      textPane = new JTextPane();
      textPane.setEditable(false);
      }

      public Component getTreeCellRendererComponent(JTree tree, Object value, boolean isSelected,
      boolean expanded, boolean leaf, int row, boolean hasFocus) {
      textPane.setText(value.toString());
      return textPane;
      }

      public Component getTreeCellEditorComponent(JTree tree, Object value, boolean isSelected,
      boolean expanded, boolean leaf, int row) {
      textPane.setEditable(true);
      textPane.setText((String)(editorValue = value.toString()));
      return textPane;
      }

      public Object getCellEditorValue() {
      return editorValue;
      }
      }

      public BadJTree() {
      DefaultMutableTreeNode root = new DefaultMutableTreeNode("Root node");
      DefaultMutableTreeNode child = new DefaultMutableTreeNode("Child node");
      root.add(child);

      DefaultTreeModel model = new DefaultTreeModel(root);
      JTree tree = new JTree(model);

      tree.setCellRenderer(new CellEditor());
      tree.setCellEditor(new CellEditor());
      tree.setEditable(true);

      JFrame f = new JFrame();
      f.getContentPane().add(tree);
      f.setBounds(100, 100, 200, 300);
      f.setVisible(true);

      tree.startEditingAtPath(tree.getPathForRow(1));
      model.removeNodeFromParent(child);
      }

           public static void main (String args[]) {
      new BadJTree();
           }
      }

      ---------- END SOURCE ----------


      CUSTOMER SUBMITTED WORKAROUND :
      Notify the JTree that a node is going to be removed, before it is removed, so that editing can be stopped.

      Attachments

        Activity

          People

            Unassigned Unassigned
            ndcosta Nelson Dcosta (Inactive)
            Votes:
            0 Vote for this issue
            Watchers:
            0 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved:
              Imported:
              Indexed: