Class EnhancedTreeCellRenderer

  • All Implemented Interfaces:
    java.awt.image.ImageObserver, java.awt.MenuContainer, java.io.Serializable, javax.accessibility.Accessible, javax.swing.SwingConstants, javax.swing.tree.TreeCellRenderer
    Direct Known Subclasses:
    OptionsDialog.PaneNameRenderer

    public abstract class EnhancedTreeCellRenderer
    extends javax.swing.tree.DefaultTreeCellRenderer
    An enhancement of the DefaultTreeCellRenderer to be used as superclass for custom tree cell renderers. Using DefaultTreeCellRenderer as superclass for a custom tree cell renderer without further measures is not stable in regards to on-the-fly Look and Feel changes, at least not with Java 6. For Java 7 it should be tested again.

    With Java 6 the DefaultTreeCellRenderer initializes some values according to the Look and Feel in its constructor. If the DefaultTreeCellRenderer is created by the JTree code, it is recreated on a Look and Feel change. This way all works fine. But if a tree cell renderer is set explicitly on the JTree, no matter whether DefaultTreeCellRenderer, a subclass of it or a complete own implementation, the set instance is used beyond Look and Feel boundaries and this causes two problems.

    1. The values that were initialized in the constructor of DefaultTreeCellRenderer are not reset according to the new Look and Feel. Some values are partly set by the JTree code, but this is not complete and reliable and thus the renderer paints the tree cells wrongly.
    2. The Look and Feel change is first applied to the JTree, then the sizes of the tree cells which are saved in a cache are recalculated. Only after that, the children of the JTree get the new Look and Feel applied, amongst them also the tree cell renderer.
      So even if a custom tree cell renderer is aware of on-the-fly Look and Feel changes by reinitializing values from the Look and Feel if it changes, those cached sizes are still calculated for the old Look and Feel. The only way to work around this is to cause the cached sizes to be recalculated. This can be done by changing any significant property of the JTree which influences size calculations.

    To work around the described problems this enhanced tree cell renderer listens for Look and Feel changes on the JTree where this renderer is used, requests a subclass to create a new instance of the renderer and sets it on the JTree. By doing so the DefaultTreeCellRenderer reinitializes to the new Look and Feel in its constructor and the JTree recalculates the cached size values because a different object is set as tree cell renderer.

    See Also:
    Serialized Form
    • Nested Class Summary

      • Nested classes/interfaces inherited from class javax.swing.JLabel

        javax.swing.JLabel.AccessibleJLabel
      • Nested classes/interfaces inherited from class javax.swing.JComponent

        javax.swing.JComponent.AccessibleJComponent
      • Nested classes/interfaces inherited from class java.awt.Container

        java.awt.Container.AccessibleAWTContainer
      • Nested classes/interfaces inherited from class java.awt.Component

        java.awt.Component.AccessibleAWTComponent, java.awt.Component.BaselineResizeBehavior, java.awt.Component.BltBufferStrategy, java.awt.Component.FlipBufferStrategy
    • Field Summary

      • Fields inherited from class javax.swing.tree.DefaultTreeCellRenderer

        backgroundNonSelectionColor, backgroundSelectionColor, borderSelectionColor, closedIcon, hasFocus, leafIcon, openIcon, selected, textNonSelectionColor, textSelectionColor
      • Fields inherited from class javax.swing.JLabel

        labelFor
      • Fields inherited from class javax.swing.JComponent

        listenerList, TOOL_TIP_TEXT_KEY, ui, UNDEFINED_CONDITION, WHEN_ANCESTOR_OF_FOCUSED_COMPONENT, WHEN_FOCUSED, WHEN_IN_FOCUSED_WINDOW
      • Fields inherited from class java.awt.Component

        accessibleContext, BOTTOM_ALIGNMENT, CENTER_ALIGNMENT, LEFT_ALIGNMENT, RIGHT_ALIGNMENT, TOP_ALIGNMENT
      • Fields inherited from interface java.awt.image.ImageObserver

        ABORT, ALLBITS, ERROR, FRAMEBITS, HEIGHT, PROPERTIES, SOMEBITS, WIDTH
      • Fields inherited from interface javax.swing.SwingConstants

        BOTTOM, CENTER, EAST, HORIZONTAL, LEADING, LEFT, NEXT, NORTH, NORTH_EAST, NORTH_WEST, PREVIOUS, RIGHT, SOUTH, SOUTH_EAST, SOUTH_WEST, TOP, TRAILING, VERTICAL, WEST
    • Method Summary

      All Methods Instance Methods Abstract Methods Concrete Methods 
      Modifier and Type Method Description
      protected abstract void configureTreeCellRendererComponent​(javax.swing.JTree tree, java.lang.Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus)
      Configures this instance of the renderer component based on the passed in components.
      java.awt.Component getTreeCellRendererComponent​(javax.swing.JTree tree, java.lang.Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus)  
      protected abstract javax.swing.tree.TreeCellRenderer newInstance()
      Creates a new instance of the tree cell renderer.
      • Methods inherited from class javax.swing.tree.DefaultTreeCellRenderer

        firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, getBackgroundNonSelectionColor, getBackgroundSelectionColor, getBorderSelectionColor, getClosedIcon, getDefaultClosedIcon, getDefaultLeafIcon, getDefaultOpenIcon, getFont, getLeafIcon, getOpenIcon, getPreferredSize, getTextNonSelectionColor, getTextSelectionColor, invalidate, paint, repaint, repaint, repaint, revalidate, setBackground, setBackgroundNonSelectionColor, setBackgroundSelectionColor, setBorderSelectionColor, setClosedIcon, setFont, setLeafIcon, setOpenIcon, setTextNonSelectionColor, setTextSelectionColor, updateUI, validate
      • Methods inherited from class javax.swing.JLabel

        checkHorizontalKey, checkVerticalKey, getAccessibleContext, getDisabledIcon, getDisplayedMnemonic, getDisplayedMnemonicIndex, getHorizontalAlignment, getHorizontalTextPosition, getIcon, getIconTextGap, getLabelFor, getText, getUI, getUIClassID, getVerticalAlignment, getVerticalTextPosition, imageUpdate, paramString, setDisabledIcon, setDisplayedMnemonic, setDisplayedMnemonic, setDisplayedMnemonicIndex, setHorizontalAlignment, setHorizontalTextPosition, setIcon, setIconTextGap, setLabelFor, setText, setUI, setVerticalAlignment, setVerticalTextPosition
      • Methods inherited from class javax.swing.JComponent

        addAncestorListener, addNotify, addVetoableChangeListener, computeVisibleRect, contains, createToolTip, disable, enable, fireVetoableChange, getActionForKeyStroke, getActionMap, getAlignmentX, getAlignmentY, getAncestorListeners, getAutoscrolls, getBaseline, getBaselineResizeBehavior, getBorder, getBounds, getClientProperty, getComponentGraphics, getComponentPopupMenu, getConditionForKeyStroke, getDebugGraphicsOptions, getDefaultLocale, getFontMetrics, getGraphics, getHeight, getInheritsPopupMenu, getInputMap, getInputMap, getInputVerifier, getInsets, getInsets, getListeners, getLocation, getMaximumSize, getMinimumSize, getNextFocusableComponent, getPopupLocation, getRegisteredKeyStrokes, getRootPane, getSize, getToolTipLocation, getToolTipText, getToolTipText, getTopLevelAncestor, getTransferHandler, getVerifyInputWhenFocusTarget, getVetoableChangeListeners, getVisibleRect, getWidth, getX, getY, grabFocus, hide, isDoubleBuffered, isLightweightComponent, isManagingFocus, isOpaque, isOptimizedDrawingEnabled, isPaintingForPrint, isPaintingOrigin, isPaintingTile, isRequestFocusEnabled, isValidateRoot, paintBorder, paintChildren, paintComponent, paintImmediately, paintImmediately, print, printAll, printBorder, printChildren, printComponent, processComponentKeyEvent, processKeyBinding, processKeyEvent, processMouseEvent, processMouseMotionEvent, putClientProperty, registerKeyboardAction, registerKeyboardAction, removeAncestorListener, removeNotify, removeVetoableChangeListener, requestDefaultFocus, requestFocus, requestFocus, requestFocusInWindow, requestFocusInWindow, resetKeyboardActions, reshape, scrollRectToVisible, setActionMap, setAlignmentX, setAlignmentY, setAutoscrolls, setBorder, setComponentPopupMenu, setDebugGraphicsOptions, setDefaultLocale, setDoubleBuffered, setEnabled, setFocusTraversalKeys, setForeground, setInheritsPopupMenu, setInputMap, setInputVerifier, setMaximumSize, setMinimumSize, setNextFocusableComponent, setOpaque, setPreferredSize, setRequestFocusEnabled, setToolTipText, setTransferHandler, setUI, setVerifyInputWhenFocusTarget, setVisible, unregisterKeyboardAction, update
      • Methods inherited from class java.awt.Container

        add, add, add, add, add, addContainerListener, addImpl, addPropertyChangeListener, addPropertyChangeListener, applyComponentOrientation, areFocusTraversalKeysSet, countComponents, deliverEvent, doLayout, findComponentAt, findComponentAt, getComponent, getComponentAt, getComponentAt, getComponentCount, getComponents, getComponentZOrder, getContainerListeners, getFocusTraversalKeys, getFocusTraversalPolicy, getLayout, getMousePosition, insets, isAncestorOf, isFocusCycleRoot, isFocusCycleRoot, isFocusTraversalPolicyProvider, isFocusTraversalPolicySet, layout, list, list, locate, minimumSize, paintComponents, preferredSize, printComponents, processContainerEvent, processEvent, remove, remove, removeAll, removeContainerListener, setComponentZOrder, setFocusCycleRoot, setFocusTraversalPolicy, setFocusTraversalPolicyProvider, setLayout, transferFocusDownCycle, validateTree
      • Methods inherited from class java.awt.Component

        action, add, addComponentListener, addFocusListener, addHierarchyBoundsListener, addHierarchyListener, addInputMethodListener, addKeyListener, addMouseListener, addMouseMotionListener, addMouseWheelListener, bounds, checkImage, checkImage, coalesceEvents, contains, createImage, createImage, createVolatileImage, createVolatileImage, disableEvents, dispatchEvent, enable, enableEvents, enableInputMethods, getBackground, getBounds, getColorModel, getComponentListeners, getComponentOrientation, getCursor, getDropTarget, getFocusCycleRootAncestor, getFocusListeners, getFocusTraversalKeysEnabled, getForeground, getGraphicsConfiguration, getHierarchyBoundsListeners, getHierarchyListeners, getIgnoreRepaint, getInputContext, getInputMethodListeners, getInputMethodRequests, getKeyListeners, getLocale, getLocation, getLocationOnScreen, getMouseListeners, getMouseMotionListeners, getMousePosition, getMouseWheelListeners, getName, getParent, getPropertyChangeListeners, getPropertyChangeListeners, getSize, getToolkit, getTreeLock, gotFocus, handleEvent, hasFocus, inside, isBackgroundSet, isCursorSet, isDisplayable, isEnabled, isFocusable, isFocusOwner, isFocusTraversable, isFontSet, isForegroundSet, isLightweight, isMaximumSizeSet, isMinimumSizeSet, isPreferredSizeSet, isShowing, isValid, isVisible, keyDown, keyUp, list, list, list, location, lostFocus, mouseDown, mouseDrag, mouseEnter, mouseExit, mouseMove, mouseUp, move, nextFocus, paintAll, postEvent, prepareImage, prepareImage, processComponentEvent, processFocusEvent, processHierarchyBoundsEvent, processHierarchyEvent, processInputMethodEvent, processMouseWheelEvent, remove, removeComponentListener, removeFocusListener, removeHierarchyBoundsListener, removeHierarchyListener, removeInputMethodListener, removeKeyListener, removeMouseListener, removeMouseMotionListener, removeMouseWheelListener, removePropertyChangeListener, removePropertyChangeListener, repaint, repaint, requestFocus, requestFocus, requestFocusInWindow, resize, resize, setBounds, setBounds, setComponentOrientation, setCursor, setDropTarget, setFocusable, setFocusTraversalKeysEnabled, setIgnoreRepaint, setLocale, setLocation, setLocation, setMixingCutoutShape, setName, setSize, setSize, show, show, size, toString, transferFocus, transferFocusBackward, transferFocusUpCycle
      • Methods inherited from class java.lang.Object

        clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
    • Constructor Detail

      • EnhancedTreeCellRenderer

        public EnhancedTreeCellRenderer()
    • Method Detail

      • getTreeCellRendererComponent

        public final java.awt.Component getTreeCellRendererComponent​(javax.swing.JTree tree,
                                                                     java.lang.Object value,
                                                                     boolean selected,
                                                                     boolean expanded,
                                                                     boolean leaf,
                                                                     int row,
                                                                     boolean hasFocus)
        Specified by:
        getTreeCellRendererComponent in interface javax.swing.tree.TreeCellRenderer
        Overrides:
        getTreeCellRendererComponent in class javax.swing.tree.DefaultTreeCellRenderer
      • newInstance

        protected abstract javax.swing.tree.TreeCellRenderer newInstance()
        Creates a new instance of the tree cell renderer. Each invocation has to return a different object. Saving a reference and returning the same instance from different calls of this method is not appropriate.

        Any one-time initializations that are necessary and are not made in the constructor should be made in this method. The simplest implementation of this method will just call the constructor and return the result.

        This is an instance method so that the new instance can be set up with information from the current instance.

        Returns:
        a new readily initialized instance of this class
      • configureTreeCellRendererComponent

        protected abstract void configureTreeCellRendererComponent​(javax.swing.JTree tree,
                                                                   java.lang.Object value,
                                                                   boolean selected,
                                                                   boolean expanded,
                                                                   boolean leaf,
                                                                   int row,
                                                                   boolean hasFocus)
        Configures this instance of the renderer component based on the passed in components. The value is set from messaging the tree with convertValueToText, which ultimately invokes toString on value. The foreground color is set based on the selection and the icon is set based on the leaf and expanded parameters. The parameters of this method are the same as the ones of getTreeCellRendererComponent(JTree, Object, boolean, boolean, boolean, int, boolean).
        Parameters:
        tree - The tree in which this renderer component is used currently
        value - The value to be displayed for the tree cell to be rendered
        selected - Whether the tree cell to be rendered is selected
        expanded - Whether the tree cell to be rendered is expanded
        leaf - Whether the tree cell to be rendered is a leaf
        row - The row index of the tree cell to be rendered
        hasFocus - Whether the tree cell to be rendered has the focus