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

Custom tree node renderers in disabled trees can initially get "..." problem

XMLWordPrintable

    • Icon: Bug Bug
    • Resolution: Fixed
    • Icon: P4 P4
    • 1.4.0
    • 1.2.2
    • client-libs
    • merlin
    • x86
    • windows_nt



      Name: mc57594 Date: 11/21/99


      java version "1.2.2"
      Classic VM (build JDK-1.2.2-W, native threads, symcjit)
      Run this program in 1.2.2. The tree nodes are initially rendered with the
      correct icons, but the text has been clipped too short at the end,
      causing "..." to be displayed. It appears that the calculation for the entire
      width of the node is short by the width of the icon + gap.

      The problem only happens when the nodes are rendered in the tree when it is
      disabled. If in an application tree nodes are never newly rendered in disabled
      trees, the problem won't show up.

      Note that I cannot reproduce this problem using JDK1.2 - only with JDK1.2.2.

      I've also including a good workaround in the program (commented out).

      (Basic program modified from the one in bug report 4105239.)



      ----------------------- TreeNodeRendererBug.java -----------------------


      import javax.swing.*;
      import javax.swing.event.*;
      import java.awt.BorderLayout;
      import java.awt.Color;
      import java.awt.Dimension;
      import java.awt.FlowLayout;
      import java.awt.event.ActionEvent;
      import java.awt.event.ActionListener;
      import java.awt.event.WindowAdapter;
      import java.awt.event.WindowEvent;
      import javax.swing.tree.*;
      import javax.swing.Icon;
      import javax.swing.ImageIcon;
      import javax.swing.JLabel;
      import javax.swing.JTree;
      import javax.swing.tree.TreeCellRenderer;
      import javax.swing.tree.DefaultMutableTreeNode;
      import java.awt.Component;
      import java.awt.Color;
      import java.awt.Font;
      import java.awt.Graphics;

      public class TreeNodeRendererBug
      {
        /** Window for showing Tree. */
        protected JFrame frame;
        /** Tree used for the example. */
        protected JTree tree;
        /** Tree model. */
        protected DefaultTreeModel treeModel;

        /**
        * Constructs a new instance of TreeNodeRendererBug.
        */
        public TreeNodeRendererBug() {
          JMenuBar menuBar = constructMenuBar();
          JPanel panel = new JPanel(true);

          frame = new JFrame("Tree with JDK1.2.2 rendering problem");
          frame.getContentPane().add("Center", panel);
          frame.setJMenuBar(menuBar);
          frame.setBackground(Color.lightGray);

          /* Create the JTreeModel. */
          DefaultMutableTreeNode root = new DefaultMutableTreeNode(
            "This is level 0");
          treeModel = new DefaultTreeModel(root);

          DefaultMutableTreeNode Level1 = new DefaultMutableTreeNode(
            "This is level 1");
          root.add(Level1);

          DefaultMutableTreeNode Level2 = new DefaultMutableTreeNode(
            "This is level 2");
          Level1.add(Level2);

          /* Create the tree. */
          tree = new JTree(treeModel);
          tree.setEnabled(false);

          /* Make the tree use an instance of SampleTreeCellRenderer for drawing. */
          tree.setCellRenderer(getTreeCellRenderer());

          /* Make tree ask for the height of each row. */
          tree.setRowHeight(-1);

          /* Put the Tree in a scroller. */
          JScrollPane sp = new JScrollPane();
          sp.setPreferredSize(new Dimension(300, 300));
          sp.getViewport().add(tree);

          /* And show it. */
          panel.setLayout(new BorderLayout());
          panel.add("Center", sp);

          frame.addWindowListener( new WindowAdapter() {
            public void windowClosing(WindowEvent e)
            {
              System.exit(0);
            }
          });

          frame.pack();
          frame.show();
        }

        /** xxxxx a menu. */
        private JMenuBar constructMenuBar() {
          JMenu menu;
          JMenuBar menuBar = new JMenuBar();
          JMenuItem menuItem;

          menu = new JMenu("File");
          menuBar.add(menu);

          menuItem = menu.add(new JMenuItem(
              "Expand row 1 - only renders ok in JDK1.2.2 if tree is enabled"));
          menuItem.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
              tree.expandRow(1);
            }
          });

          menuItem = menu.add(new JMenuItem("Enabled/Disable tree"));
          menuItem.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
              tree.setEnabled(!tree.isEnabled());
            }
          });

          menuItem = menu.add(new JMenuItem("Exit"));
          menuItem.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
              System.exit(0);
            }
          });

          return menuBar;
        }

        /**
        * Returns the TreeNode instance that is selected in the tree.
        * If nothing is selected, null is returned.
        */
        protected DefaultMutableTreeNode getSelectedNode() {
          TreePath selPath = tree.getSelectionPath();

          if(selPath != null)
            return
              (DefaultMutableTreeNode)selPath.getLastPathComponent();
          return null;
        }

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


        public synchronized static CustomTreeCellRenderer getTreeCellRenderer()
        {
          CustomTreeCellRenderer cr = new CustomTreeCellRenderer();
          return cr;
        }

      }










      class CustomTreeCellRenderer implements TreeCellRenderer {

        static private DefaultTreeCellRenderer defaultRenderer =
            new DefaultTreeCellRenderer();

        private DefaultTreeCellRenderer renderer = new DefaultTreeCellRenderer();

        public CustomTreeCellRenderer() {
          renderer.setOpenIcon(UIManager.getIcon("Tree.openIcon"));
          renderer.setClosedIcon(UIManager.getIcon("Tree.closedIcon"));
          renderer.setLeafIcon(UIManager.getIcon("Tree.leafIcon"));

          // WORKAROUND for "..." treenode rendering problem in a disabled tree.
      // renderer.setIcon(UIManager.getIcon("Tree.closedIcon"));
        }


        public synchronized Component getTreeCellRendererComponent(JTree object,
                                                                   Object value,
                                                                   boolean selected,
                                                                   boolean expanded,
                                                                   boolean leaf,
                                                                   int row,
                                                                   boolean hasFocus) {
          return renderer.getTreeCellRendererComponent(object,
                                                  value,
                                                  selected,
                                                  expanded,
                                                  leaf,
                                                  row,
                                                  hasFocus);
        }

      }
      (Review ID: 97194)
      ======================================================================

            svioletsunw Scott Violet (Inactive)
            mchamnessunw Mark Chamness (Inactive)
            Votes:
            0 Vote for this issue
            Watchers:
            0 Start watching this issue

              Created:
              Updated:
              Resolved:
              Imported:
              Indexed: