Class AbstractHighlighter

  • All Implemented Interfaces:
    Highlighter
    Direct Known Subclasses:
    AlignmentHighlighter, BorderHighlighter, ColorHighlighter, CompoundHighlighter, EnabledHighlighter, FontHighlighter, IconHighlighter, PainterHighlighter, ToolTipHighlighter

    public abstract class AbstractHighlighter
    extends Object
    implements Highlighter
    Abstract Highlighter implementation which manages change notification and supports conditional highlighting. Subclasses are required to fire ChangeEvents on internal changes which might effect the highlight. The HighlightPredicate controls whether or not a highlight should be applied for the given ComponentAdapter, subclasses must guarantee to respect its decision.

    Concrete custom implementations should focus on a single (or few) visual attribute to highlight. This allows easy re-use by composition. F.i. a custom FontHighlighter:

    
     public static class FontHighlighter extends AbstractHighlighter {
     
         private Font font;
     
         public FontHighlighter(HighlightPredicate predicate, Font font) {
             super(predicate);
             setFont(font);
         }
     
         @Override
         protected Component doHighlight(Component component,
                 ComponentAdapter adapter) {
             component.setFont(font);
             return component;
         }
         
         public final void setFont(Font font) {
            if (equals(font, this.font)) return;
            this.font = font;
            fireStateChanged();
         }
         
     
     }
     
     
    Client code can combine the effect with a f.i. Color decoration, and use a shared HighlightPredicate to apply both for the same condition.
    
     HighlightPredicate predicate = new HighlightPredicate() {
         public boolean isHighlighted(Component renderer, ComponentAdapter adapter) {
             Object value = adapter.getFilteredValueAt(adapter.row, adapter.column);
             return (value instanceof Number) && ((Number) value).intValue() < 0;
         }
     };
     table.setHighlighters(
             new ColorHighlighter(predicate, Color.RED, null),
             new FontHighlighter(predicate, myBoldFont));
     
    Author:
    Jeanette Winzenburg
    See Also:
    HighlightPredicate, ComponentProvider
    • Method Detail

      • setHighlightPredicate

        public void setHighlightPredicate​(HighlightPredicate predicate)
        Set the HighlightPredicate used to decide whether a cell should be highlighted. If null, sets the predicate to HighlightPredicate.ALWAYS. The default value is HighlightPredicate.ALWAYS.
        Parameters:
        predicate - the HighlightPredicate to use.
      • getHighlightPredicate

        public HighlightPredicate getHighlightPredicate()
        Returns the HighlightPredicate used to decide whether a cell should be highlighted. Guaranteed to be never null.
        Returns:
        the HighlightPredicate to use, never null.
      • canHighlight

        protected boolean canHighlight​(Component component,
                                       ComponentAdapter adapter)
        Subclasses may override to further limit the highlighting based on Highlighter state, f.i. a PainterHighlighter can only be applied to PainterAware components.

        This implementation returns true always.

        Parameters:
        component -
        adapter -
        Returns:
        a boolean indication if the adapter can be highlighted based general state. This implementation returns true always.
      • areEqual

        protected boolean areEqual​(Object oneItem,
                                   Object anotherItem)
        Returns true if the to objects are either both null or equal each other.
        Parameters:
        oneItem - one item
        anotherItem - another item
        Returns:
        true if both are null or equal other, false otherwise.
      • fireStateChanged

        protected final void fireStateChanged()
        Notifies registered ChangeListeners about state changes.

        Note: subclasses should be polite and implement any property setters to fire only if the property is really changed.