DecoratedListUI, DecoratedTreeUI Demo

What Is It

The DecoratedListUI and DecoratedTreeUI render clickable/animatable icons on rows in lists/trees.

How To Use It

The demo in this showcase app offers a few ideas for potential decorations.

Each decoration is basically an actionable icon that implements this interface:

public interface ListDecoration {

    Icon getIcon(JList list, Object value, int row,
        boolean isSelected, boolean cellHasFocus, boolean isRollover,
        boolean isPressed);

    boolean isVisible(JList list, Object value, int row,
        boolean isSelected, boolean cellHasFocus);

    ActionListener getActionListener(JList list, Object value,
        int row, boolean isSelected, boolean cellHasFocus);

    Point getLocation(JList list, Object value, int row,
        boolean isSelected, boolean cellHasFocus);
}

And then to integrate it:

JList list = new JList();
list.putClientProperty( DecoratedListUI.KEY_DECORATIONS,
    new ListDecoration[] { decoration1, decoration2, etc. });
list.setUI(new DecoratedListUI());

How It Works

The decorations are "stamped" on each row, like the CellRendererPane. That is: they don't exist in the component hierarchy, and the ComponentUI is responsible for interpreting mouse clicks and triggering the appropriate ActionListener.

Discussion

This is great way to add extra functionality for power users without adding too much visual clutter.

However: you need to decide what you want to do about accessibility. This class represents a UI choice that is not accessible. This may be OK if every feature that is part of a decoration is also available somewhere else in your application. For example: if you also have a menu shortcut that activates the same feature.

The alternative is to try to layer actual JComponents into your UI, and that has its own complex set of challenges for a list or a tree.