FileDocCategorySizeDatePackage
JList.javaAPI DocJava SE 6 API139161Tue Jun 10 00:26:38 BST 2008javax.swing

JList

public class JList extends JComponent implements Scrollable, Accessible
A component that displays a list of objects and allows the user to select one or more items. A separate model, {@code ListModel}, maintains the contents of the list.

It's easy to display an array or Vector of objects, using the {@code JList} constructor that automatically builds a read-only {@code ListModel} instance for you:

// Create a JList that displays strings from an array

String[] data = {"one", "two", "three", "four"};
JList myList = new JList(data);

// Create a JList that displays the superclasses of JList.class, by
// creating it with a Vector populated with this data

Vector superClasses = new Vector();
Class rootClass = javax.swing.JList.class;
for(Class cls = rootClass; cls != null; cls = cls.getSuperclass()) {
superClasses.addElement(cls);
}
JList myList = new JList(superClasses);

// The automatically created model is stored in JList's "model"
// property, which you can retrieve

ListModel model = myList.getModel();
for(int i = 0; i < model.getSize(); i++) {
System.out.println(model.getElementAt(i));
}

A {@code ListModel} can be supplied directly to a {@code JList} by way of a constructor or the {@code setModel} method. The contents need not be static - the number of items, and the values of items can change over time. A correct {@code ListModel} implementation notifies the set of {@code javax.swing.event.ListDataListener}s that have been added to it, each time a change occurs. These changes are characterized by a {@code javax.swing.event.ListDataEvent}, which identifies the range of list indices that have been modified, added, or removed. {@code JList}'s {@code ListUI} is responsible for keeping the visual representation up to date with changes, by listening to the model.

Simple, dynamic-content, {@code JList} applications can use the {@code DefaultListModel} class to maintain list elements. This class implements the {@code ListModel} interface and also provides a java.util.Vector-like API. Applications that need a more custom ListModel implementation may instead wish to subclass {@code AbstractListModel}, which provides basic support for managing and notifying listeners. For example, a read-only implementation of {@code AbstractListModel}:

// This list model has about 2^16 elements. Enjoy scrolling.

ListModel bigData = new AbstractListModel() {
public int getSize() { return Short.MAX_VALUE; }
public Object getElementAt(int index) { return "Index " + index; }
};

The selection state of a {@code JList} is managed by another separate model, an instance of {@code ListSelectionModel}. {@code JList} is initialized with a selection model on construction, and also contains methods to query or set this selection model. Additionally, {@code JList} provides convenient methods for easily managing the selection. These methods, such as {@code setSelectedIndex} and {@code getSelectedValue}, are cover methods that take care of the details of interacting with the selection model. By default, {@code JList}'s selection model is configured to allow any combination of items to be selected at a time; selection mode {@code MULTIPLE_INTERVAL_SELECTION}. The selection mode can be changed on the selection model directly, or via {@code JList}'s cover method. Responsibility for updating the selection model in response to user gestures lies with the list's {@code ListUI}.

A correct {@code ListSelectionModel} implementation notifies the set of {@code javax.swing.event.ListSelectionListener}s that have been added to it each time a change to the selection occurs. These changes are characterized by a {@code javax.swing.event.ListSelectionEvent}, which identifies the range of the selection change.

The preferred way to listen for changes in list selection is to add {@code ListSelectionListener}s directly to the {@code JList}. {@code JList} then takes care of listening to the the selection model and notifying your listeners of change.

Responsibility for listening to selection changes in order to keep the list's visual representation up to date lies with the list's {@code ListUI}.

Painting of cells in a {@code JList} is handled by a delegate called a cell renderer, installed on the list as the {@code cellRenderer} property. The renderer provides a {@code java.awt.Component} that is used like a "rubber stamp" to paint the cells. Each time a cell needs to be painted, the list's {@code ListUI} asks the cell renderer for the component, moves it into place, and has it paint the contents of the cell by way of its {@code paint} method. A default cell renderer, which uses a {@code JLabel} component to render, is installed by the lists's {@code ListUI}. You can substitute your own renderer using code like this:

// Display an icon and a string for each object in the list.

class MyCellRenderer extends JLabel implements ListCellRenderer {
final static ImageIcon longIcon = new ImageIcon("long.gif");
final static ImageIcon shortIcon = new ImageIcon("short.gif");

// This is the only method defined by ListCellRenderer.
// We just reconfigure the JLabel each time we're called.

public Component getListCellRendererComponent(
JList list, // the list
Object value, // value to display
int index, // cell index
boolean isSelected, // is the cell selected
boolean cellHasFocus) // does the cell have focus
{
String s = value.toString();
setText(s);
setIcon((s.length() > 10) ? longIcon : shortIcon);
if (isSelected) {
setBackground(list.getSelectionBackground());
setForeground(list.getSelectionForeground());
} else {
setBackground(list.getBackground());
setForeground(list.getForeground());
}
setEnabled(list.isEnabled());
setFont(list.getFont());
setOpaque(true);
return this;
}
}

myList.setCellRenderer(new MyCellRenderer());

Another job for the cell renderer is in helping to determine sizing information for the list. By default, the list's {@code ListUI} determines the size of cells by asking the cell renderer for its preferred size for each list item. This can be expensive for large lists of items. To avoid these calculations, you can set a {@code fixedCellWidth} and {@code fixedCellHeight} on the list, or have these values calculated automatically based on a single prototype value:

JList bigDataList = new JList(bigData);

// We don't want the JList implementation to compute the width
// or height of all of the list cells, so we give it a string
// that's as big as we'll need for any cell. It uses this to
// compute values for the fixedCellWidth and fixedCellHeight
// properties.

bigDataList.setPrototypeCellValue("Index 1234567890");

{@code JList} doesn't implement scrolling directly. To create a list that scrolls, make it the viewport view of a {@code JScrollPane}. For example:

JScrollPane scrollPane = new JScrollPane(myList);

// Or in two steps:
JScrollPane scrollPane = new JScrollPane();
scrollPane.getViewport().setView(myList);

{@code JList} doesn't provide any special handling of double or triple (or N) mouse clicks, but it's easy to add a {@code MouseListener} if you wish to take action on these events. Use the {@code locationToIndex} method to determine what cell was clicked. For example:

MouseListener mouseListener = new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
if (e.getClickCount() == 2) {
int index = list.locationToIndex(e.getPoint());
System.out.println("Double clicked on Item " + index);
}
}
};
list.addMouseListener(mouseListener);

Warning: Swing is not thread safe. For more information see Swing's Threading Policy.

Warning: Serialized objects of this class will not be compatible with future Swing releases. The current serialization support is appropriate for short term storage or RMI between applications running the same version of Swing. As of 1.4, support for long term storage of all JavaBeansTM has been added to the java.beans package. Please see {@link java.beans.XMLEncoder}.

See How to Use Lists in The Java Tutorial for further documentation. Also see the article Advanced JList Programming in The Swing Connection.

see
ListModel
see
AbstractListModel
see
DefaultListModel
see
ListSelectionModel
see
DefaultListSelectionModel
see
ListCellRenderer
see
DefaultListCellRenderer
beaninfo
attribute: isContainer false description: A component which allows for the selection of one or more objects from a list.
version
1.138 01/17/07
author
Hans Muller

Fields Summary
private static final String
uiClassID
public static final int
VERTICAL
Indicates a vertical layout of cells, in a single column; the default layout.
public static final int
VERTICAL_WRAP
Indicates a "newspaper style" layout with cells flowing vertically then horizontally.
public static final int
HORIZONTAL_WRAP
Indicates a "newspaper style" layout with cells flowing horizontally then vertically.
private int
fixedCellWidth
private int
fixedCellHeight
private int
horizontalScrollIncrement
private Object
prototypeCellValue
private int
visibleRowCount
private Color
selectionForeground
private Color
selectionBackground
private boolean
dragEnabled
private ListSelectionModel
selectionModel
private ListModel
dataModel
private ListCellRenderer
cellRenderer
private ListSelectionListener
selectionListener
private int
layoutOrientation
How to lay out the cells; defaults to VERTICAL.
private DropMode
dropMode
The drop mode for this component.
private transient DropLocation
dropLocation
The drop location.
Constructors Summary
public JList(ListModel dataModel)
Constructs a {@code JList} that displays elements from the specified, {@code non-null}, model. All {@code JList} constructors delegate to this one.

This constructor registers the list with the {@code ToolTipManager}, allowing for tooltips to be provided by the cell renderers.

param
dataModel the model for the list
exception
IllegalArgumentException if the model is {@code null}

        if (dataModel == null) {
            throw new IllegalArgumentException("dataModel must be non null");
        }

        // Register with the ToolTipManager so that tooltips from the
        // renderer show through.
        ToolTipManager toolTipManager = ToolTipManager.sharedInstance();
        toolTipManager.registerComponent(this);
        
        layoutOrientation = VERTICAL;

        this.dataModel = dataModel;
        selectionModel = createSelectionModel();
        setAutoscrolls(true);
        setOpaque(true);
        updateUI();
    
public JList(Object[] listData)
Constructs a JList that displays the elements in the specified array. This constructor creates a read-only model for the given array, and then delegates to the constructor that takes a {@code ListModel}.

Attempts to pass a {@code null} value to this method results in undefined behavior and, most likely, exceptions. The created model references the given array directly. Attempts to modify the array after constructing the list results in undefined behavior.

param
listData the array of Objects to be loaded into the data model, {@code non-null}

        this (
            new AbstractListModel() {
                public int getSize() { return listData.length; }
                public Object getElementAt(int i) { return listData[i]; }
            }
        );
    
public JList(Vector listData)
Constructs a JList that displays the elements in the specified Vector. This constructor creates a read-only model for the given {@code Vector}, and then delegates to the constructor that takes a {@code ListModel}.

Attempts to pass a {@code null} value to this method results in undefined behavior and, most likely, exceptions. The created model references the given {@code Vector} directly. Attempts to modify the {@code Vector} after constructing the list results in undefined behavior.

param
listData the Vector to be loaded into the data model, {@code non-null}

        this (
            new AbstractListModel() {
                public int getSize() { return listData.size(); }
                public Object getElementAt(int i) { return listData.elementAt(i); }
            }
        );
    
public JList()
Constructs a JList with an empty, read-only, model.

        this (
            new AbstractListModel() {
              public int getSize() { return 0; }
              public Object getElementAt(int i) { return "No Data Model"; }
            }
        );
    
Methods Summary
public voidaddListSelectionListener(javax.swing.event.ListSelectionListener listener)
Adds a listener to the list, to be notified each time a change to the selection occurs; the preferred way of listening for selection state changes. {@code JList} takes care of listening for selection state changes in the selection model, and notifies the given listener of each change. {@code ListSelectionEvent}s sent to the listener have a {@code source} property set to this list.

param
listener the {@code ListSelectionListener} to add
see
#getSelectionModel
see
#getListSelectionListeners

        if (selectionListener == null) {
            selectionListener = new ListSelectionHandler();
            getSelectionModel().addListSelectionListener(selectionListener);
        }

        listenerList.add(ListSelectionListener.class, listener);
    
public voidaddSelectionInterval(int anchor, int lead)
Sets the selection to be the union of the specified interval with current selection. Both the {@code anchor} and {@code lead} indices are included. {@code anchor} doesn't have to be less than or equal to {@code lead}. This is a cover method that delegates to the method of the same name on the list's selection model.

Refer to the documentation of the selection model class being used for details on how values less than {@code 0} are handled.

param
anchor the first index to add to the selection
param
lead the last index to add to the selection
see
ListSelectionModel#addSelectionInterval
see
DefaultListSelectionModel#addSelectionInterval
see
#createSelectionModel
see
#setSelectionInterval
see
#removeSelectionInterval

        getSelectionModel().addSelectionInterval(anchor, lead);
    
private voidcheckScrollableParameters(java.awt.Rectangle visibleRect, int orientation)
--- The Scrollable Implementation ---

	if (visibleRect == null) {
	    throw new IllegalArgumentException("visibleRect must be non-null");
	}
        switch (orientation) {
        case SwingConstants.VERTICAL:
        case SwingConstants.HORIZONTAL:
            break;
        default:
            throw new IllegalArgumentException("orientation must be one of: VERTICAL, HORIZONTAL");
        }
    
public voidclearSelection()
Clears the selection; after calling this method, {@code isSelectionEmpty} will return {@code true}. This is a cover method that delegates to the method of the same name on the list's selection model.

see
ListSelectionModel#clearSelection
see
#isSelectionEmpty

        getSelectionModel().clearSelection();
    
protected javax.swing.ListSelectionModelcreateSelectionModel()
Returns an instance of {@code DefaultListSelectionModel}; called during construction to initialize the list's selection model property.

return
a {@code DefaultListSelecitonModel}, used to initialize the list's selection model property during construction
see
#setSelectionModel
see
DefaultListSelectionModel

        return new DefaultListSelectionModel();
    
javax.swing.JList$DropLocationdropLocationForPoint(java.awt.Point p)
Calculates a drop location in this component, representing where a drop at the given point should insert data.

param
p the point to calculate a drop location for
return
the drop location, or null

        DropLocation location = null;
        Rectangle rect = null;

        int index = locationToIndex(p);
        if (index != -1) {
            rect = getCellBounds(index, index);
        }

        switch(dropMode) {
            case USE_SELECTION:
            case ON:
                location = new DropLocation(p,
                    (rect != null && rect.contains(p)) ? index : -1,
                    false);

                break;
            case INSERT:
                if (index == -1) {
                    location = new DropLocation(p, getModel().getSize(), true);
                    break;
                }

                if (layoutOrientation == HORIZONTAL_WRAP) {
                    boolean ltr = getComponentOrientation().isLeftToRight();

                    if (SwingUtilities2.liesInHorizontal(rect, p, ltr, false) == TRAILING) {
                        index++;
                    // special case for below all cells
                    } else if (index == getModel().getSize() - 1 && p.y >= rect.y + rect.height) {
                        index++;
                    }
                } else {
                    if (SwingUtilities2.liesInVertical(rect, p, false) == TRAILING) {
                        index++;
                    }
                }

                location = new DropLocation(p, index, true);

                break;
            case ON_OR_INSERT:
                if (index == -1) {
                    location = new DropLocation(p, getModel().getSize(), true);
                    break;
                }

                boolean between = false;

                if (layoutOrientation == HORIZONTAL_WRAP) {
                    boolean ltr = getComponentOrientation().isLeftToRight();

                    Section section = SwingUtilities2.liesInHorizontal(rect, p, ltr, true);
                    if (section == TRAILING) {
                        index++;
                        between = true;
                    // special case for below all cells
                    } else if (index == getModel().getSize() - 1 && p.y >= rect.y + rect.height) {
                        index++;
                        between = true;
                    } else if (section == LEADING) {
                        between = true;
                    }
                } else {
                    Section section = SwingUtilities2.liesInVertical(rect, p, true);
                    if (section == LEADING) {
                        between = true;
                    } else if (section == TRAILING) {
                        index++;
                        between = true;
                    }
                }

                location = new DropLocation(p, index, between);

                break;
            default:
                assert false : "Unexpected drop mode";
        }

        return location;
    
public voidensureIndexIsVisible(int index)
Scrolls the list within an enclosing viewport to make the specified cell completely visible. This calls {@code scrollRectToVisible} with the bounds of the specified cell. For this method to work, the {@code JList} must be within a JViewport.

If the given index is outside the list's range of cells, this method results in nothing.

param
index the index of the cell to make visible
see
JComponent#scrollRectToVisible
see
#getVisibleRect

        Rectangle cellBounds = getCellBounds(index, index);
        if (cellBounds != null) {
            scrollRectToVisible(cellBounds);
        }
    
protected voidfireSelectionValueChanged(int firstIndex, int lastIndex, boolean isAdjusting)
Notifies {@code ListSelectionListener}s added directly to the list of selection changes made to the selection model. {@code JList} listens for changes made to the selection in the selection model, and forwards notification to listeners added to the list directly, by calling this method.

This method constructs a {@code ListSelectionEvent} with this list as the source, and the specified arguments, and sends it to the registered {@code ListSelectionListeners}.

param
firstIndex the first index in the range, {@code <= lastIndex}
param
lastIndex the last index in the range, {@code >= firstIndex}
param
isAdjusting whether or not this is one in a series of multiple events, where changes are still being made
see
#addListSelectionListener
see
#removeListSelectionListener
see
javax.swing.event.ListSelectionEvent
see
EventListenerList

        Object[] listeners = listenerList.getListenerList();
        ListSelectionEvent e = null;

        for (int i = listeners.length - 2; i >= 0; i -= 2) {
            if (listeners[i] == ListSelectionListener.class) {
                if (e == null) {
                    e = new ListSelectionEvent(this, firstIndex, lastIndex,
                                               isAdjusting);
                }
                ((ListSelectionListener)listeners[i+1]).valueChanged(e);
            }
        }
    
public javax.accessibility.AccessibleContextgetAccessibleContext()
Gets the {@code AccessibleContext} associated with this {@code JList}. For {@code JList}, the {@code AccessibleContext} takes the form of an {@code AccessibleJList}.

A new {@code AccessibleJList} instance is created if necessary.

return
an {@code AccessibleJList} that serves as the {@code AccessibleContext} of this {@code JList}

        if (accessibleContext == null) {
            accessibleContext = new AccessibleJList();
        }
        return accessibleContext;
    
public intgetAnchorSelectionIndex()
Returns the anchor selection index. This is a cover method that delegates to the method of the same name on the list's selection model.

return
the anchor selection index
see
ListSelectionModel#getAnchorSelectionIndex

        return getSelectionModel().getAnchorSelectionIndex();
    
public java.awt.RectanglegetCellBounds(int index0, int index1)
Returns the bounding rectangle, in the list's coordinate system, for the range of cells specified by the two indices. These indices can be supplied in any order.

If the smaller index is outside the list's range of cells, this method returns {@code null}. If the smaller index is valid, but the larger index is outside the list's range, the bounds of just the first index is returned. Otherwise, the bounds of the valid range is returned.

This is a cover method that delegates to the method of the same name in the list's {@code ListUI}. It returns {@code null} if the list has no {@code ListUI}.

param
index0 the first index in the range
param
index1 the second index in the range
return
the bounding rectangle for the range of cells, or {@code null}

        ListUI ui = getUI();
        return (ui != null) ? ui.getCellBounds(this, index0, index1) : null;
    
public javax.swing.ListCellRenderergetCellRenderer()
Returns the object responsible for painting list items.

return
the value of the {@code cellRenderer} property
see
#setCellRenderer

        return cellRenderer;
    
public booleangetDragEnabled()
Returns whether or not automatic drag handling is enabled.

return
the value of the {@code dragEnabled} property
see
#setDragEnabled
since
1.4

	return dragEnabled;
    
public final javax.swing.JList$DropLocationgetDropLocation()
Returns the location that this component should visually indicate as the drop location during a DnD operation over the component, or {@code null} if no location is to currently be shown.

This method is not meant for querying the drop location from a {@code TransferHandler}, as the drop location is only set after the {@code TransferHandler}'s canImport has returned and has allowed for the location to be shown.

When this property changes, a property change event with name "dropLocation" is fired by the component.

By default, responsibility for listening for changes to this property and indicating the drop location visually lies with the list's {@code ListUI}, which may paint it directly and/or install a cell renderer to do so. Developers wishing to implement custom drop location painting and/or replace the default cell renderer, may need to honor this property.

return
the drop location
see
#setDropMode
see
TransferHandler#canImport(TransferHandler.TransferSupport)
since
1.6

        return dropLocation;
    
public final javax.swing.DropModegetDropMode()
Returns the drop mode for this component.

return
the drop mode for this component
see
#setDropMode
since
1.6

        return dropMode;
    
public intgetFirstVisibleIndex()
Returns the smallest list index that is currently visible. In a left-to-right {@code componentOrientation}, the first visible cell is found closest to the list's upper-left corner. In right-to-left orientation, it is found closest to the upper-right corner. If nothing is visible or the list is empty, {@code -1} is returned. Note that the returned cell may only be partially visible.

return
the index of the first visible cell
see
#getLastVisibleIndex
see
JComponent#getVisibleRect

	Rectangle r = getVisibleRect();
        int first;
        if (this.getComponentOrientation().isLeftToRight()) {
            first = locationToIndex(r.getLocation());
        } else {
            first = locationToIndex(new Point((r.x + r.width) - 1, r.y));
        }
	if (first != -1) {
	    Rectangle bounds = getCellBounds(first, first);
	    if (bounds != null) {
                SwingUtilities.computeIntersection(r.x, r.y, r.width, r.height, bounds);
                if (bounds.width == 0 || bounds.height == 0) {		
		    first = -1;
		}
	    }
	}
	return first;
    
public intgetFixedCellHeight()
Returns the value of the {@code fixedCellHeight} property.

return
the fixed cell height
see
#setFixedCellHeight

        return fixedCellHeight;
    
public intgetFixedCellWidth()
Returns the value of the {@code fixedCellWidth} property.

return
the fixed cell width
see
#setFixedCellWidth

        return fixedCellWidth;
    
public intgetLastVisibleIndex()
Returns the largest list index that is currently visible. If nothing is visible or the list is empty, {@code -1} is returned. Note that the returned cell may only be partially visible.

return
the index of the last visible cell
see
#getFirstVisibleIndex
see
JComponent#getVisibleRect

        boolean leftToRight = this.getComponentOrientation().isLeftToRight();
        Rectangle r = getVisibleRect();
        Point lastPoint;
        if (leftToRight) {
            lastPoint = new Point((r.x + r.width) - 1, (r.y + r.height) - 1);
        } else {
            lastPoint = new Point(r.x, (r.y + r.height) - 1);
        }
        int location = locationToIndex(lastPoint);

        if (location != -1) {
            Rectangle bounds = getCellBounds(location, location);

            if (bounds != null) {
                SwingUtilities.computeIntersection(r.x, r.y, r.width, r.height, bounds);
                if (bounds.width == 0 || bounds.height == 0) {
		    // Try the top left(LTR) or top right(RTL) corner, and
		    // then go across checking each cell for HORIZONTAL_WRAP.
		    // Try the lower left corner, and then go across checking
		    // each cell for other list layout orientation.
		    boolean isHorizontalWrap =
			(getLayoutOrientation() == HORIZONTAL_WRAP);
		    Point visibleLocation = isHorizontalWrap ?
			new Point(lastPoint.x, r.y) :
			new Point(r.x, lastPoint.y);
		    int last;
		    int visIndex = -1;
		    int lIndex = location;
		    location = -1;

		    do {
			last = visIndex;
			visIndex = locationToIndex(visibleLocation);

			if (visIndex != -1) {
			    bounds = getCellBounds(visIndex, visIndex);
			    if (visIndex != lIndex && bounds != null &&
				bounds.contains(visibleLocation)) {
				location = visIndex;
				if (isHorizontalWrap) {
				    visibleLocation.y = bounds.y + bounds.height;
				    if (visibleLocation.y >= lastPoint.y) {
					// Past visible region, bail.
					last = visIndex;
				    }
				}
				else {
				    visibleLocation.x = bounds.x + bounds.width;
				    if (visibleLocation.x >= lastPoint.x) {
					// Past visible region, bail.
					last = visIndex;
				    }
				}

			    }
			    else {
				last = visIndex;
			    }
			}
		    } while (visIndex != -1 && last != visIndex);
		}
            }
        }
        return location;
    
public intgetLayoutOrientation()
Returns the layout orientation property for the list: {@code VERTICAL} if the layout is a single column of cells, {@code VERTICAL_WRAP} if the layout is "newspaper style" with the content flowing vertically then horizontally, or {@code HORIZONTAL_WRAP} if the layout is "newspaper style" with the content flowing horizontally then vertically.

return
the value of the {@code layoutOrientation} property
see
#setLayoutOrientation
since
1.4

	return layoutOrientation;
    
public intgetLeadSelectionIndex()
Returns the lead selection index. This is a cover method that delegates to the method of the same name on the list's selection model.

return
the lead selection index
see
ListSelectionModel#getLeadSelectionIndex
beaninfo
description: The lead selection index.

        return getSelectionModel().getLeadSelectionIndex();
    
public javax.swing.event.ListSelectionListener[]getListSelectionListeners()
Returns an array of all the {@code ListSelectionListener}s added to this {@code JList} by way of {@code addListSelectionListener}.

return
all of the {@code ListSelectionListener}s on this list, or an empty array if no listeners have been added
see
#addListSelectionListener
since
1.4

        return (ListSelectionListener[])listenerList.getListeners(
                ListSelectionListener.class);
    
public intgetMaxSelectionIndex()
Returns the largest selected cell index, or {@code -1} if the selection is empty. This is a cover method that delegates to the method of the same name on the list's selection model.

return
the largest selected cell index
see
ListSelectionModel#getMaxSelectionIndex

        return getSelectionModel().getMaxSelectionIndex();
    
public intgetMinSelectionIndex()
Returns the smallest selected cell index, or {@code -1} if the selection is empty. This is a cover method that delegates to the method of the same name on the list's selection model.

return
the smallest selected cell index, or {@code -1}
see
ListSelectionModel#getMinSelectionIndex

        return getSelectionModel().getMinSelectionIndex();
    
public javax.swing.ListModelgetModel()
Returns the data model that holds the list of items displayed by the JList component.

return
the ListModel that provides the displayed list of items
see
#setModel

        return dataModel;
    
public intgetNextMatch(java.lang.String prefix, int startIndex, javax.swing.text.Position$Bias bias)
Returns the next list element whose {@code toString} value starts with the given prefix.

param
prefix the string to test for a match
param
startIndex the index for starting the search
param
bias the search direction, either Position.Bias.Forward or Position.Bias.Backward.
return
the index of the next list element that starts with the prefix; otherwise {@code -1}
exception
IllegalArgumentException if prefix is {@code null} or startIndex is out of bounds
since
1.4

	ListModel model = getModel();
	int max = model.getSize();
	if (prefix == null) {
	    throw new IllegalArgumentException();
	}
	if (startIndex < 0 || startIndex >= max) {
	    throw new IllegalArgumentException();
	}
	prefix = prefix.toUpperCase();

	// start search from the next element after the selected element
	int increment = (bias == Position.Bias.Forward) ? 1 : -1;
	int index = startIndex;
	do {
	    Object o = model.getElementAt(index);
	    
	    if (o != null) {
		String string;
		
		if (o instanceof String) {
		    string = ((String)o).toUpperCase();
		}
		else {
		    string = o.toString();
		    if (string != null) {
			string = string.toUpperCase();
		    }
		}
		
		if (string != null && string.startsWith(prefix)) {
		    return index;
		}
	    }
	    index = (index + increment + max) % max;
	} while (index != startIndex);
	return -1;
    
public java.awt.DimensiongetPreferredScrollableViewportSize()
Computes the size of viewport needed to display {@code visibleRowCount} rows. The value returned by this method depends on the layout orientation:

{@code VERTICAL}:
This is trivial if both {@code fixedCellWidth} and {@code fixedCellHeight} have been set (either explicitly or by specifying a prototype cell value). The width is simply the {@code fixedCellWidth} plus the list's horizontal insets. The height is the {@code fixedCellHeight} multiplied by the {@code visibleRowCount}, plus the list's vertical insets.

If either {@code fixedCellWidth} or {@code fixedCellHeight} haven't been specified, heuristics are used. If the model is empty, the width is the {@code fixedCellWidth}, if greater than {@code 0}, or a hard-coded value of {@code 256}. The height is the {@code fixedCellHeight} multiplied by {@code visibleRowCount}, if {@code fixedCellHeight} is greater than {@code 0}, otherwise it is a hard-coded value of {@code 16} multiplied by {@code visibleRowCount}.

If the model isn't empty, the width is the preferred size's width, typically the width of the widest list element. The height is the {@code fixedCellHeight} multiplied by the {@code visibleRowCount}, plus the list's vertical insets.

{@code VERTICAL_WRAP} or {@code HORIZONTAL_WRAP}:
This method simply returns the value from {@code getPreferredSize}. The list's {@code ListUI} is expected to override {@code getPreferredSize} to return an appropriate value.

return
a dimension containing the size of the viewport needed to display {@code visibleRowCount} rows
see
#getPreferredScrollableViewportSize
see
#setPrototypeCellValue

        if (getLayoutOrientation() != VERTICAL) {
            return getPreferredSize();
        }
        Insets insets = getInsets();
        int dx = insets.left + insets.right;
        int dy = insets.top + insets.bottom;

        int visibleRowCount = getVisibleRowCount();
        int fixedCellWidth = getFixedCellWidth();
        int fixedCellHeight = getFixedCellHeight();

        if ((fixedCellWidth > 0) && (fixedCellHeight > 0)) {
            int width = fixedCellWidth + dx;
            int height = (visibleRowCount * fixedCellHeight) + dy;
            return new Dimension(width, height);
        }
        else if (getModel().getSize() > 0) {
            int width = getPreferredSize().width;
            int height;
            Rectangle r = getCellBounds(0, 0);
            if (r != null) {
                height = (visibleRowCount * r.height) + dy;
            }
            else {
                // Will only happen if UI null, shouldn't matter what we return
                height = 1;
            }
            return new Dimension(width, height);
        }
        else {
            fixedCellWidth = (fixedCellWidth > 0) ? fixedCellWidth : 256;
            fixedCellHeight = (fixedCellHeight > 0) ? fixedCellHeight : 16;
            return new Dimension(fixedCellWidth, fixedCellHeight * visibleRowCount);
        }
    
public java.lang.ObjectgetPrototypeCellValue()
Returns the "prototypical" cell value -- a value used to calculate a fixed width and height for cells. This can be {@code null} if there is no such value.

return
the value of the {@code prototypeCellValue} property
see
#setPrototypeCellValue

        return prototypeCellValue;
    
public intgetScrollableBlockIncrement(java.awt.Rectangle visibleRect, int orientation, int direction)
Returns the distance to scroll to expose the next or previous block.

For vertical scrolling, the following rules are used:

  • if scrolling down, returns the distance to scroll so that the last visible element becomes the first completely visible element
  • if scrolling up, returns the distance to scroll so that the first visible element becomes the last completely visible element
  • returns {@code visibleRect.height} if the list is empty

For horizontal scrolling, when the layout orientation is either {@code VERTICAL_WRAP} or {@code HORIZONTAL_WRAP}:

  • if scrolling right, returns the distance to scroll so that the last visible element becomes the first completely visible element
  • if scrolling left, returns the distance to scroll so that the first visible element becomes the last completely visible element
  • returns {@code visibleRect.width} if the list is empty

For horizontal scrolling and {@code VERTICAL} orientation, returns {@code visibleRect.width}.

Note that the value of {@code visibleRect} must be the equal to {@code this.getVisibleRect()}.

param
visibleRect the view area visible within the viewport
param
orientation {@code SwingConstants.HORIZONTAL} or {@code SwingConstants.VERTICAL}
param
direction less or equal to zero to scroll up/back, greater than zero for down/forward
return
the "block" increment for scrolling in the specified direction; always positive
see
#getScrollableUnitIncrement
see
Scrollable#getScrollableBlockIncrement
throws
IllegalArgumentException if {@code visibleRect} is {@code null}, or {@code orientation} isn't one of {@code SwingConstants.VERTICAL} or {@code SwingConstants.HORIZONTAL}

	checkScrollableParameters(visibleRect, orientation);
        if (orientation == SwingConstants.VERTICAL) {
            int inc = visibleRect.height;
            /* Scroll Down */
            if (direction > 0) {
                // last cell is the lowest left cell
                int last = locationToIndex(new Point(visibleRect.x, visibleRect.y+visibleRect.height-1));
                if (last != -1) {
		    Rectangle lastRect = getCellBounds(last,last);
		    if (lastRect != null) {
			inc = lastRect.y - visibleRect.y;
			if ( (inc == 0) && (last < getModel().getSize()-1) ) {
			    inc = lastRect.height;
			}
		    }
                }
            }
            /* Scroll Up */
            else {
                int newFirst = locationToIndex(new Point(visibleRect.x, visibleRect.y-visibleRect.height));
                int first = getFirstVisibleIndex();
                if (newFirst != -1) {
		    if (first == -1) {
			first = locationToIndex(visibleRect.getLocation());
		    }
                    Rectangle newFirstRect = getCellBounds(newFirst,newFirst);
                    Rectangle firstRect = getCellBounds(first,first);
		    if ((newFirstRect != null) && (firstRect!=null)) {
			while ( (newFirstRect.y + visibleRect.height <
				 firstRect.y + firstRect.height) &&
				(newFirstRect.y < firstRect.y) ) {
			    newFirst++;
			    newFirstRect = getCellBounds(newFirst,newFirst);
			}
			inc = visibleRect.y - newFirstRect.y;
			if ( (inc <= 0) && (newFirstRect.y > 0)) {
			    newFirst--;
			    newFirstRect = getCellBounds(newFirst,newFirst);
			    if (newFirstRect != null) {
				inc = visibleRect.y - newFirstRect.y;
			    }
			}
		    }    
		}
            }
            return inc;
        }
	else if (orientation == SwingConstants.HORIZONTAL &&
		 getLayoutOrientation() != JList.VERTICAL) {
            boolean leftToRight = getComponentOrientation().isLeftToRight();
	    int inc = visibleRect.width;
	    /* Scroll Right (in ltr mode) or Scroll Left (in rtl mode) */
	    if (direction > 0) {
                // position is upper right if ltr, or upper left otherwise
                int x = visibleRect.x + (leftToRight ? (visibleRect.width - 1) : 0);
                int last = locationToIndex(new Point(x, visibleRect.y));

		if (last != -1) {
		    Rectangle lastRect = getCellBounds(last,last);
		    if (lastRect != null) {
                        if (leftToRight) {
                            inc = lastRect.x - visibleRect.x;
                        } else {
                            inc = visibleRect.x + visibleRect.width
                                      - (lastRect.x + lastRect.width);
                        }
			if (inc < 0) {
			    inc += lastRect.width;
			} else if ( (inc == 0) && (last < getModel().getSize()-1) ) {
			    inc = lastRect.width;
			}
		    }
		}
	    }
	    /* Scroll Left (in ltr mode) or Scroll Right (in rtl mode) */
	    else {
                // position is upper left corner of the visibleRect shifted
                // left by the visibleRect.width if ltr, or upper right shifted
                // right by the visibleRect.width otherwise
                int x = visibleRect.x + (leftToRight
                                         ? -visibleRect.width
                                         : visibleRect.width - 1 + visibleRect.width);
                int first = locationToIndex(new Point(x, visibleRect.y));

		if (first != -1) {
		    Rectangle firstRect = getCellBounds(first,first);
		    if (firstRect != null) {
                        // the right of the first cell
                        int firstRight = firstRect.x + firstRect.width;

                        if (leftToRight) {
                            if ((firstRect.x < visibleRect.x - visibleRect.width)
                                    && (firstRight < visibleRect.x)) {
                                inc = visibleRect.x - firstRight;
                            } else {
                                inc = visibleRect.x - firstRect.x;
                            }
			} else {
                            int visibleRight = visibleRect.x + visibleRect.width;

                            if ((firstRight > visibleRight + visibleRect.width)
                                    && (firstRect.x > visibleRight)) {
                                inc = firstRect.x - visibleRight;
                            } else {
                                inc = firstRight - visibleRight;
                            }
                        }
		    }
		}
	    }
	    return inc;
	}
        return visibleRect.width;
    
public booleangetScrollableTracksViewportHeight()
Returns {@code true} if this {@code JList} is displayed in a {@code JViewport} and the viewport is taller than the list's preferred height, or if the layout orientation is {@code VERTICAL_WRAP} and {@code visibleRowCount <= 0}; otherwise returns {@code false}.

If {@code false}, then don't track the viewport's height. This allows vertical scrolling if the {@code JViewport} is itself embedded in a {@code JScrollPane}.

return
whether or not an enclosing viewport should force the list's height to match its own
see
Scrollable#getScrollableTracksViewportHeight

        if (getLayoutOrientation() == VERTICAL_WRAP &&
                     getVisibleRowCount() <= 0) {
            return true;
        }
	if (getParent() instanceof JViewport) {
	    return (((JViewport)getParent()).getHeight() > getPreferredSize().height);
	}
	return false;
    
public booleangetScrollableTracksViewportWidth()
Returns {@code true} if this {@code JList} is displayed in a {@code JViewport} and the viewport is wider than the list's preferred width, or if the layout orientation is {@code HORIZONTAL_WRAP} and {@code visibleRowCount <= 0}; otherwise returns {@code false}.

If {@code false}, then don't track the viewport's width. This allows horizontal scrolling if the {@code JViewport} is itself embedded in a {@code JScrollPane}.

return
whether or not an enclosing viewport should force the list's width to match its own
see
Scrollable#getScrollableTracksViewportWidth

        if (getLayoutOrientation() == HORIZONTAL_WRAP &&
                                      getVisibleRowCount() <= 0) {
            return true;
        }
	if (getParent() instanceof JViewport) {
	    return (((JViewport)getParent()).getWidth() > getPreferredSize().width);
	}
	return false;
    
public intgetScrollableUnitIncrement(java.awt.Rectangle visibleRect, int orientation, int direction)
Returns the distance to scroll to expose the next or previous row (for vertical scrolling) or column (for horizontal scrolling).

For horizontal scrolling, if the layout orientation is {@code VERTICAL}, then the list's font size is returned (or {@code 1} if the font is {@code null}).

param
visibleRect the view area visible within the viewport
param
orientation {@code SwingConstants.HORIZONTAL} or {@code SwingConstants.VERTICAL}
param
direction less or equal to zero to scroll up/back, greater than zero for down/forward
return
the "unit" increment for scrolling in the specified direction; always positive
see
#getScrollableBlockIncrement
see
Scrollable#getScrollableUnitIncrement
throws
IllegalArgumentException if {@code visibleRect} is {@code null}, or {@code orientation} isn't one of {@code SwingConstants.VERTICAL} or {@code SwingConstants.HORIZONTAL}

        checkScrollableParameters(visibleRect, orientation);

        if (orientation == SwingConstants.VERTICAL) {
            int row = locationToIndex(visibleRect.getLocation());

            if (row == -1) {
                return 0;
            }
            else {
                /* Scroll Down */
                if (direction > 0) {
                    Rectangle r = getCellBounds(row, row);
                    return (r == null) ? 0 : r.height - (visibleRect.y - r.y);
                }
                /* Scroll Up */
                else {
                    Rectangle r = getCellBounds(row, row);

                    /* The first row is completely visible and it's row 0.
                     * We're done.
                     */
                    if ((r.y == visibleRect.y) && (row == 0))  {
                        return 0;
                    }
                    /* The first row is completely visible, return the
                     * height of the previous row or 0 if the first row
                     * is the top row of the list.
                     */
                    else if (r.y == visibleRect.y) {
                        Point loc = r.getLocation();
                        loc.y--;
                        int prevIndex = locationToIndex(loc);
                        Rectangle prevR = getCellBounds(prevIndex, prevIndex);

                        if (prevR == null || prevR.y >= r.y) {
                            return 0;
                        }
                        return prevR.height;
                    }
                    /* The first row is partially visible, return the
                     * height of hidden part.
                     */
                    else {
                        return visibleRect.y - r.y;
                    }
                }
            }
        } else if (orientation == SwingConstants.HORIZONTAL &&
                           getLayoutOrientation() != JList.VERTICAL) {
            boolean leftToRight = getComponentOrientation().isLeftToRight();
            int index;
            Point leadingPoint;
            
            if (leftToRight) {
                leadingPoint = visibleRect.getLocation();
            }
            else {
                leadingPoint = new Point(visibleRect.x + visibleRect.width -1,
                                         visibleRect.y);
            }
            index = locationToIndex(leadingPoint);

            if (index != -1) {
                Rectangle cellBounds = getCellBounds(index, index);
                if (cellBounds != null && cellBounds.contains(leadingPoint)) {
                    int leadingVisibleEdge;
                    int leadingCellEdge;

                    if (leftToRight) {
                        leadingVisibleEdge = visibleRect.x;
                        leadingCellEdge = cellBounds.x;
                    }
                    else {
                        leadingVisibleEdge = visibleRect.x + visibleRect.width;
                        leadingCellEdge = cellBounds.x + cellBounds.width;
                    }

                    if (leadingCellEdge != leadingVisibleEdge) {
                        if (direction < 0) {
                            // Show remainder of leading cell
                            return Math.abs(leadingVisibleEdge - leadingCellEdge);

                        }
                        else if (leftToRight) {
                            // Hide rest of leading cell
                            return leadingCellEdge + cellBounds.width - leadingVisibleEdge;
                        }
                        else {
                            // Hide rest of leading cell
                            return leadingVisibleEdge - cellBounds.x;
                        }
                    }
                    // ASSUME: All cells are the same width
                    return cellBounds.width;
                }
            }
        }
        Font f = getFont();
        return (f != null) ? f.getSize() : 1;
    
public intgetSelectedIndex()
Returns the smallest selected cell index; the selection when only a single item is selected in the list. When multiple items are selected, it is simply the smallest selected index. Returns {@code -1} if there is no selection.

This method is a cover that delegates to {@code getMinSelectionIndex}.

return
the smallest selected cell index
see
#getMinSelectionIndex
see
#addListSelectionListener

        return getMinSelectionIndex();
    
public int[]getSelectedIndices()
Returns an array of all of the selected indices, in increasing order.

return
all of the selected indices, in increasing order, or an empty array if nothing is selected
see
#removeSelectionInterval
see
#addListSelectionListener

        ListSelectionModel sm = getSelectionModel();
        int iMin = sm.getMinSelectionIndex();
        int iMax = sm.getMaxSelectionIndex();

        if ((iMin < 0) || (iMax < 0)) {
            return new int[0];
        }

        int[] rvTmp = new int[1+ (iMax - iMin)];
        int n = 0;
        for(int i = iMin; i <= iMax; i++) {
            if (sm.isSelectedIndex(i)) {
                rvTmp[n++] = i;
            }
        }
        int[] rv = new int[n];
        System.arraycopy(rvTmp, 0, rv, 0, n);
        return rv;
    
public java.lang.ObjectgetSelectedValue()
Returns the value for the smallest selected cell index; the selected value when only a single item is selected in the list. When multiple items are selected, it is simply the value for the smallest selected index. Returns {@code null} if there is no selection.

This is a convenience method that simply returns the model value for {@code getMinSelectionIndex}.

return
the first selected value
see
#getMinSelectionIndex
see
#getModel
see
#addListSelectionListener

        int i = getMinSelectionIndex();
        return (i == -1) ? null : getModel().getElementAt(i);
    
public java.lang.Object[]getSelectedValues()
Returns an array of all the selected values, in increasing order based on their indices in the list.

return
the selected values, or an empty array if nothing is selected
see
#isSelectedIndex
see
#getModel
see
#addListSelectionListener

        ListSelectionModel sm = getSelectionModel();
        ListModel dm = getModel();

        int iMin = sm.getMinSelectionIndex();
        int iMax = sm.getMaxSelectionIndex();

        if ((iMin < 0) || (iMax < 0)) {
            return new Object[0];
        }

        Object[] rvTmp = new Object[1+ (iMax - iMin)];
        int n = 0;
        for(int i = iMin; i <= iMax; i++) {
            if (sm.isSelectedIndex(i)) {
                rvTmp[n++] = dm.getElementAt(i);
            }
        }
        Object[] rv = new Object[n];
        System.arraycopy(rvTmp, 0, rv, 0, n);
        return rv;
    
public java.awt.ColorgetSelectionBackground()
Returns the color used to draw the background of selected items. {@code DefaultListCellRenderer} uses this color to draw the background of items in the selected state, as do the renderers installed by most {@code ListUI} implementations.

return
the color to draw the background of selected items
see
#setSelectionBackground
see
DefaultListCellRenderer

        return selectionBackground;
    
public java.awt.ColorgetSelectionForeground()
Returns the color used to draw the foreground of selected items. {@code DefaultListCellRenderer} uses this color to draw the foreground of items in the selected state, as do the renderers installed by most {@code ListUI} implementations.

return
the color to draw the foreground of selected items
see
#setSelectionForeground
see
DefaultListCellRenderer

        return selectionForeground;
    
public intgetSelectionMode()
Returns the current selection mode for the list. This is a cover method that delegates to the method of the same name on the list's selection model.

return
the current selection mode
see
#setSelectionMode

        return getSelectionModel().getSelectionMode();
    
public javax.swing.ListSelectionModelgetSelectionModel()
Returns the current selection model. The selection model maintains the selection state of the list. See the class level documentation for more details.

return
the ListSelectionModel that maintains the list's selections
see
#setSelectionModel
see
ListSelectionModel

        return selectionModel;
    
public java.lang.StringgetToolTipText(java.awt.event.MouseEvent event)
Returns the tooltip text to be used for the given event. This overrides {@code JComponent}'s {@code getToolTipText} to first check the cell renderer component for the cell over which the event occurred, returning its tooltip text, if any. This implementation allows you to specify tooltip text on the cell level, by using {@code setToolTipText} on your cell renderer component.

Note: For JList to properly display the tooltips of its renderers in this manner, JList must be a registered component with the ToolTipManager. This registration is done automatically in the constructor. However, if at a later point JList is unregistered, by way of a call to {@code setToolTipText(null)}, tips from the renderers will no longer display.

param
event the {@code MouseEvent} to fetch the tooltip text for
see
JComponent#setToolTipText
see
JComponent#getToolTipText

        if(event != null) {
            Point p = event.getPoint();
            int index = locationToIndex(p);
            ListCellRenderer r = getCellRenderer();
            Rectangle cellBounds;

            if (index != -1 && r != null && (cellBounds =
                               getCellBounds(index, index)) != null &&
                               cellBounds.contains(p.x, p.y)) {
                ListSelectionModel lsm = getSelectionModel();
                Component rComponent = r.getListCellRendererComponent(
                           this, getModel().getElementAt(index), index,
                           lsm.isSelectedIndex(index),
                           (hasFocus() && (lsm.getLeadSelectionIndex() ==
                                           index)));

                if(rComponent instanceof JComponent) {
                    MouseEvent      newEvent;

                    p.translate(-cellBounds.x, -cellBounds.y);
                    newEvent = new MouseEvent(rComponent, event.getID(),
                                              event.getWhen(),
                                              event.getModifiers(),
                                              p.x, p.y,
                                              event.getXOnScreen(),
                                              event.getYOnScreen(),
                                              event.getClickCount(),
                                              event.isPopupTrigger(),
                                              MouseEvent.NOBUTTON);

                    String tip = ((JComponent)rComponent).getToolTipText(
                                              newEvent);

                    if (tip != null) {
                        return tip;
                    }
                }
            }
        }
        return super.getToolTipText();
    
public javax.swing.plaf.ListUIgetUI()
Returns the {@code ListUI}, the look and feel object that renders this component.

return
the ListUI object that renders this component

        return (ListUI)ui;
    
public java.lang.StringgetUIClassID()
Returns {@code "ListUI"}, the UIDefaults key used to look up the name of the {@code javax.swing.plaf.ListUI} class that defines the look and feel for this component.

return
the string "ListUI"
see
JComponent#getUIClassID
see
UIDefaults#getUI

        return uiClassID;
    
public booleangetValueIsAdjusting()
Returns the value of the selection model's {@code isAdjusting} property.

This is a cover method that delegates to the method of the same name on the list's selection model.

return
the value of the selection model's {@code isAdjusting} property.
see
#setValueIsAdjusting
see
ListSelectionModel#getValueIsAdjusting

        return getSelectionModel().getValueIsAdjusting();
    
public intgetVisibleRowCount()
Returns the value of the {@code visibleRowCount} property. See the documentation for {@link #setVisibleRowCount} for details on how to interpret this value.

return
the value of the {@code visibleRowCount} property.
see
#setVisibleRowCount

        return visibleRowCount;
    
public java.awt.PointindexToLocation(int index)
Returns the origin of the specified item in the list's coordinate system. This method returns {@code null} if the index isn't valid.

This is a cover method that delegates to the method of the same name in the list's {@code ListUI}. It returns {@code null} if the list has no {@code ListUI}.

param
index the cell index
return
the origin of the cell, or {@code null}

        ListUI ui = getUI();
        return (ui != null) ? ui.indexToLocation(this, index) : null;
    
public booleanisSelectedIndex(int index)
Returns {@code true} if the specified index is selected, else {@code false}. This is a cover method that delegates to the method of the same name on the list's selection model.

param
index index to be queried for selection state
return
{@code true} if the specified index is selected, else {@code false}
see
ListSelectionModel#isSelectedIndex
see
#setSelectedIndex

        return getSelectionModel().isSelectedIndex(index);
    
public booleanisSelectionEmpty()
Returns {@code true} if nothing is selected, else {@code false}. This is a cover method that delegates to the method of the same name on the list's selection model.

return
{@code true} if nothing is selected, else {@code false}
see
ListSelectionModel#isSelectionEmpty
see
#clearSelection

        return getSelectionModel().isSelectionEmpty();
    
public intlocationToIndex(java.awt.Point location)
Returns the cell index closest to the given location in the list's coordinate system. To determine if the cell actually contains the specified location, compare the point against the cell's bounds, as provided by {@code getCellBounds}. This method returns {@code -1} if the model is empty

This is a cover method that delegates to the method of the same name in the list's {@code ListUI}. It returns {@code -1} if the list has no {@code ListUI}.

param
location the coordinates of the point
return
the cell index closest to the given location, or {@code -1}

        ListUI ui = getUI();
        return (ui != null) ? ui.locationToIndex(this, location) : -1;
    
protected java.lang.StringparamString()
Returns a {@code String} representation of this {@code JList}. This method is intended to be used only for debugging purposes, and the content and format of the returned {@code String} may vary between implementations. The returned {@code String} may be empty, but may not be {@code null}.

return
a {@code String} representation of this {@code JList}.

        String selectionForegroundString = (selectionForeground != null ?
                                            selectionForeground.toString() :
                                            "");
        String selectionBackgroundString = (selectionBackground != null ?
                                            selectionBackground.toString() :
                                            "");

	return super.paramString() +
        ",fixedCellHeight=" + fixedCellHeight +
        ",fixedCellWidth=" + fixedCellWidth +
        ",horizontalScrollIncrement=" + horizontalScrollIncrement +
        ",selectionBackground=" + selectionBackgroundString +
        ",selectionForeground=" + selectionForegroundString +
        ",visibleRowCount=" + visibleRowCount +
        ",layoutOrientation=" + layoutOrientation;
    
public voidremoveListSelectionListener(javax.swing.event.ListSelectionListener listener)
Removes a selection listener from the list.

param
listener the {@code ListSelectionListener} to remove
see
#addListSelectionListener
see
#getSelectionModel

        listenerList.remove(ListSelectionListener.class, listener);
    
public voidremoveSelectionInterval(int index0, int index1)
Sets the selection to be the set difference of the specified interval and the current selection. Both the {@code index0} and {@code index1} indices are removed. {@code index0} doesn't have to be less than or equal to {@code index1}. This is a cover method that delegates to the method of the same name on the list's selection model.

Refer to the documentation of the selection model class being used for details on how values less than {@code 0} are handled.

param
index0 the first index to remove from the selection
param
index1 the last index to remove from the selection
see
ListSelectionModel#removeSelectionInterval
see
DefaultListSelectionModel#removeSelectionInterval
see
#createSelectionModel
see
#setSelectionInterval
see
#addSelectionInterval

        getSelectionModel().removeSelectionInterval(index0, index1);
    
public voidsetCellRenderer(javax.swing.ListCellRenderer cellRenderer)
Sets the delegate that is used to paint each cell in the list. The job of a cell renderer is discussed in detail in the class level documentation.

If the {@code prototypeCellValue} property is {@code non-null}, setting the cell renderer also causes the {@code fixedCellWidth} and {@code fixedCellHeight} properties to be re-calculated. Only one PropertyChangeEvent is generated however - for the cellRenderer property.

The default value of this property is provided by the {@code ListUI} delegate, i.e. by the look and feel implementation.

This is a JavaBeans bound property.

param
cellRenderer the ListCellRenderer that paints list cells
see
#getCellRenderer
beaninfo
bound: true attribute: visualUpdate true description: The component used to draw the cells.

        ListCellRenderer oldValue = this.cellRenderer;
        this.cellRenderer = cellRenderer;

        /* If the cellRenderer has changed and prototypeCellValue
         * was set, then recompute fixedCellWidth and fixedCellHeight.
         */
        if ((cellRenderer != null) && !cellRenderer.equals(oldValue)) {
            updateFixedCellSize();
        }

        firePropertyChange("cellRenderer", oldValue, cellRenderer);
    
public voidsetDragEnabled(boolean b)
Turns on or off automatic drag handling. In order to enable automatic drag handling, this property should be set to {@code true}, and the list's {@code TransferHandler} needs to be {@code non-null}. The default value of the {@code dragEnabled} property is {@code false}.

The job of honoring this property, and recognizing a user drag gesture, lies with the look and feel implementation, and in particular, the list's {@code ListUI}. When automatic drag handling is enabled, most look and feels (including those that subclass {@code BasicLookAndFeel}) begin a drag and drop operation whenever the user presses the mouse button over an item and then moves the mouse a few pixels. Setting this property to {@code true} can therefore have a subtle effect on how selections behave.

If a look and feel is used that ignores this property, you can still begin a drag and drop operation by calling {@code exportAsDrag} on the list's {@code TransferHandler}.

param
b whether or not to enable automatic drag handling
exception
HeadlessException if b is true and GraphicsEnvironment.isHeadless() returns true
see
java.awt.GraphicsEnvironment#isHeadless
see
#getDragEnabled
see
#setTransferHandler
see
TransferHandler
since
1.4
beaninfo
description: determines whether automatic drag handling is enabled bound: false

        if (b && GraphicsEnvironment.isHeadless()) {
            throw new HeadlessException();
        }
	dragEnabled = b;
    
java.lang.ObjectsetDropLocation(javax.swing.TransferHandler$DropLocation location, java.lang.Object state, boolean forDrop)
Called to set or clear the drop location during a DnD operation. In some cases, the component may need to use it's internal selection temporarily to indicate the drop location. To help facilitate this, this method returns and accepts as a parameter a state object. This state object can be used to store, and later restore, the selection state. Whatever this method returns will be passed back to it in future calls, as the state parameter. If it wants the DnD system to continue storing the same state, it must pass it back every time. Here's how this is used:

Let's say that on the first call to this method the component decides to save some state (because it is about to use the selection to show a drop index). It can return a state object to the caller encapsulating any saved selection state. On a second call, let's say the drop location is being changed to something else. The component doesn't need to restore anything yet, so it simply passes back the same state object to have the DnD system continue storing it. Finally, let's say this method is messaged with null. This means DnD is finished with this component for now, meaning it should restore state. At this point, it can use the state parameter to restore said state, and of course return null since there's no longer anything to store.

param
location the drop location (as calculated by dropLocationForPoint) or null if there's no longer a valid drop location
param
state the state object saved earlier for this component, or null
param
forDrop whether or not the method is being called because an actual drop occurred
return
any saved state for this component, or null if none


        Object retVal = null;
        DropLocation listLocation = (DropLocation)location;

        if (dropMode == DropMode.USE_SELECTION) {
            if (listLocation == null) {
                if (!forDrop && state != null) {
                    setSelectedIndices(((int[][])state)[0]);

                    int anchor = ((int[][])state)[1][0];
                    int lead = ((int[][])state)[1][1];

                    SwingUtilities2.setLeadAnchorWithoutSelection(
                            getSelectionModel(), lead, anchor);
                }
            } else {
                if (dropLocation == null) {
                    int[] inds = getSelectedIndices();
                    retVal = new int[][] {inds, {getAnchorSelectionIndex(),
                                                 getLeadSelectionIndex()}};
                } else {
                    retVal = state;
                }

                int index = listLocation.getIndex();
                if (index == -1) {
                    clearSelection();
                    getSelectionModel().setAnchorSelectionIndex(-1);
                    getSelectionModel().setLeadSelectionIndex(-1);
                } else {
                    setSelectionInterval(index, index);
                }
            }
        }

        DropLocation old = dropLocation;
        dropLocation = listLocation;
        firePropertyChange("dropLocation", old, dropLocation);

        return retVal;
    
public final voidsetDropMode(javax.swing.DropMode dropMode)
Sets the drop mode for this component. For backward compatibility, the default for this property is DropMode.USE_SELECTION. Usage of one of the other modes is recommended, however, for an improved user experience. DropMode.ON, for instance, offers similar behavior of showing items as selected, but does so without affecting the actual selection in the list.

JList supports the following drop modes:

  • DropMode.USE_SELECTION
  • DropMode.ON
  • DropMode.INSERT
  • DropMode.ON_OR_INSERT
The drop mode is only meaningful if this component has a TransferHandler that accepts drops.

param
dropMode the drop mode to use
throws
IllegalArgumentException if the drop mode is unsupported or null
see
#getDropMode
see
#getDropLocation
see
#setTransferHandler
see
TransferHandler
since
1.6

        if (dropMode != null) {
            switch (dropMode) {
                case USE_SELECTION:
                case ON:
                case INSERT:
                case ON_OR_INSERT:
                    this.dropMode = dropMode;
                    return;
            }
        }

        throw new IllegalArgumentException(dropMode + ": Unsupported drop mode for list");
    
public voidsetFixedCellHeight(int height)
Sets a fixed value to be used for the height of every cell in the list. If {@code height} is -1, cell heights are computed in the {@code ListUI} by applying getPreferredSize to the cell renderer component for each list element.

The default value of this property is {@code -1}.

This is a JavaBeans bound property.

param
height the height to be used for for all cells in the list
see
#setPrototypeCellValue
see
#setFixedCellWidth
see
JComponent#addPropertyChangeListener
beaninfo
bound: true attribute: visualUpdate true description: Defines a fixed cell height when greater than zero.

        int oldValue = fixedCellHeight;
        fixedCellHeight = height;
        firePropertyChange("fixedCellHeight", oldValue, fixedCellHeight);
    
public voidsetFixedCellWidth(int width)
Sets a fixed value to be used for the width of every cell in the list. If {@code width} is -1, cell widths are computed in the {@code ListUI} by applying getPreferredSize to the cell renderer component for each list element.

The default value of this property is {@code -1}.

This is a JavaBeans bound property.

param
width the width to be used for all cells in the list
see
#setPrototypeCellValue
see
#setFixedCellWidth
see
JComponent#addPropertyChangeListener
beaninfo
bound: true attribute: visualUpdate true description: Defines a fixed cell width when greater than zero.

        int oldValue = fixedCellWidth;
        fixedCellWidth = width;
        firePropertyChange("fixedCellWidth", oldValue, fixedCellWidth);
    
public voidsetLayoutOrientation(int layoutOrientation)
Defines the way list cells are layed out. Consider a {@code JList} with five cells. Cells can be layed out in one of the following ways:

VERTICAL: 0
1
2
3
4

HORIZONTAL_WRAP: 0 1 2
3 4

VERTICAL_WRAP: 0 3
1 4
2

A description of these layouts follows:

Value

Description

VERTICAL Cells are layed out vertically in a single column.
HORIZONTAL_WRAP Cells are layed out horizontally, wrapping to a new row as necessary. If the {@code visibleRowCount} property is less than or equal to zero, wrapping is determined by the width of the list; otherwise wrapping is done in such a way as to ensure {@code visibleRowCount} rows in the list.
VERTICAL_WRAP Cells are layed out vertically, wrapping to a new column as necessary. If the {@code visibleRowCount} property is less than or equal to zero, wrapping is determined by the height of the list; otherwise wrapping is done at {@code visibleRowCount} rows.

The default value of this property is VERTICAL.

param
layoutOrientation the new layout orientation, one of: {@code VERTICAL}, {@code HORIZONTAL_WRAP} or {@code VERTICAL_WRAP}
see
#getLayoutOrientation
see
#setVisibleRowCount
see
#getScrollableTracksViewportHeight
see
#getScrollableTracksViewportWidth
throws
IllegalArgumentException if {@code layoutOrientation} isn't one of the allowable values
since
1.4
beaninfo
bound: true attribute: visualUpdate true description: Defines the way list cells are layed out. enum: VERTICAL JList.VERTICAL HORIZONTAL_WRAP JList.HORIZONTAL_WRAP VERTICAL_WRAP JList.VERTICAL_WRAP

	int oldValue = this.layoutOrientation;
	switch (layoutOrientation) {
	case VERTICAL:
	case VERTICAL_WRAP:
        case HORIZONTAL_WRAP:
	    this.layoutOrientation = layoutOrientation;
	    firePropertyChange("layoutOrientation", oldValue, layoutOrientation);
	    break;
	default:
            throw new IllegalArgumentException("layoutOrientation must be one of: VERTICAL, HORIZONTAL_WRAP or VERTICAL_WRAP");
	}
    
public voidsetListData(java.lang.Object[] listData)
Constructs a read-only ListModel from an array of objects, and calls {@code setModel} with this model.

Attempts to pass a {@code null} value to this method results in undefined behavior and, most likely, exceptions. The created model references the given array directly. Attempts to modify the array after invoking this method results in undefined behavior.

param
listData an array of {@code Objects} containing the items to display in the list
see
#setModel

        setModel (
            new AbstractListModel() {
                public int getSize() { return listData.length; }
                public Object getElementAt(int i) { return listData[i]; }
            }
        );
    
public voidsetListData(java.util.Vector listData)
Constructs a read-only ListModel from a Vector and calls {@code setModel} with this model.

Attempts to pass a {@code null} value to this method results in undefined behavior and, most likely, exceptions. The created model references the given {@code Vector} directly. Attempts to modify the {@code Vector} after invoking this method results in undefined behavior.

param
listData a Vector containing the items to display in the list
see
#setModel

        setModel (
            new AbstractListModel() {
                public int getSize() { return listData.size(); }
                public Object getElementAt(int i) { return listData.elementAt(i); }
            }
        );
    
public voidsetModel(javax.swing.ListModel model)
Sets the model that represents the contents or "value" of the list, notifies property change listeners, and then clears the list's selection.

This is a JavaBeans bound property.

param
model the ListModel that provides the list of items for display
exception
IllegalArgumentException if model is null
see
#getModel
see
#clearSelection
beaninfo
bound: true attribute: visualUpdate true description: The object that contains the data to be drawn by this JList.

        if (model == null) {
            throw new IllegalArgumentException("model must be non null");
        }
        ListModel oldValue = dataModel;
        dataModel = model;
        firePropertyChange("model", oldValue, dataModel);
        clearSelection();
    
public voidsetPrototypeCellValue(java.lang.Object prototypeCellValue)
Sets the {@code prototypeCellValue} property, and then (if the new value is {@code non-null}), computes the {@code fixedCellWidth} and {@code fixedCellHeight} properties by requesting the cell renderer component for the given value (and index 0) from the cell renderer, and using that component's preferred size.

This method is useful when the list is too long to allow the {@code ListUI} to compute the width/height of each cell, and there is a single cell value that is known to occupy as much space as any of the others, a so-called prototype.

While all three of the {@code prototypeCellValue}, {@code fixedCellHeight}, and {@code fixedCellWidth} properties may be modified by this method, {@code PropertyChangeEvent} notifications are only sent when the {@code prototypeCellValue} property changes.

To see an example which sets this property, see the class description above.

The default value of this property is null.

This is a JavaBeans bound property.

param
prototypeCellValue the value on which to base fixedCellWidth and fixedCellHeight
see
#getPrototypeCellValue
see
#setFixedCellWidth
see
#setFixedCellHeight
see
JComponent#addPropertyChangeListener
beaninfo
bound: true attribute: visualUpdate true description: The cell prototype value, used to compute cell width and height.

        Object oldValue = this.prototypeCellValue;
        this.prototypeCellValue = prototypeCellValue;

        /* If the prototypeCellValue has changed and is non-null,
         * then recompute fixedCellWidth and fixedCellHeight.
         */

        if ((prototypeCellValue != null) && !prototypeCellValue.equals(oldValue)) {
            updateFixedCellSize();
        }

        firePropertyChange("prototypeCellValue", oldValue, prototypeCellValue);
    
public voidsetSelectedIndex(int index)
Selects a single cell. Does nothing if the given index is greater than or equal to the model size. This is a convenience method that uses {@code setSelectionInterval} on the selection model. Refer to the documentation for the selection model class being used for details on how values less than {@code 0} are handled.

param
index the index of the cell to select
see
ListSelectionModel#setSelectionInterval
see
#isSelectedIndex
see
#addListSelectionListener
beaninfo
description: The index of the selected cell.

	if (index >= getModel().getSize()) {
	    return;
	}
        getSelectionModel().setSelectionInterval(index, index);
    
public voidsetSelectedIndices(int[] indices)
Changes the selection to be the set of indices specified by the given array. Indices greater than or equal to the model size are ignored. This is a convenience method that clears the selection and then uses {@code addSelectionInterval} on the selection model to add the indices. Refer to the documentation of the selection model class being used for details on how values less than {@code 0} are handled.

param
indices an array of the indices of the cells to select, {@code non-null}
see
ListSelectionModel#addSelectionInterval
see
#isSelectedIndex
see
#addListSelectionListener
throws
NullPointerException if the given array is {@code null}

        ListSelectionModel sm = getSelectionModel();
        sm.clearSelection();
	int size = getModel().getSize();
        for(int i = 0; i < indices.length; i++) {
	    if (indices[i] < size) {
		sm.addSelectionInterval(indices[i], indices[i]);
	    }
        }
    
public voidsetSelectedValue(java.lang.Object anObject, boolean shouldScroll)
Selects the specified object from the list.

param
anObject the object to select
param
shouldScroll {@code true} if the list should scroll to display the selected object, if one exists; otherwise {@code false}

        if(anObject == null)
            setSelectedIndex(-1);
        else if(!anObject.equals(getSelectedValue())) {
            int i,c;
            ListModel dm = getModel();
            for(i=0,c=dm.getSize();i<c;i++)
                if(anObject.equals(dm.getElementAt(i))){
                    setSelectedIndex(i);
                    if(shouldScroll)
                        ensureIndexIsVisible(i);
                    repaint();  /** FIX-ME setSelectedIndex does not redraw all the time with the basic l&f**/
                    return;
                }
            setSelectedIndex(-1);
        }
        repaint(); /** FIX-ME setSelectedIndex does not redraw all the time with the basic l&f**/
    
public voidsetSelectionBackground(java.awt.Color selectionBackground)
Sets the color used to draw the background of selected items, which cell renderers can use fill selected cells. {@code DefaultListCellRenderer} uses this color to fill the background of items in the selected state, as do the renderers installed by most {@code ListUI} implementations.

The default value of this property is defined by the look and feel implementation.

This is a JavaBeans bound property.

param
selectionBackground the {@code Color} to use for the background of selected cells
see
#getSelectionBackground
see
#setSelectionForeground
see
#setForeground
see
#setBackground
see
#setFont
see
DefaultListCellRenderer
beaninfo
bound: true attribute: visualUpdate true description: The background color of selected cells.

        Color oldValue = this.selectionBackground;
        this.selectionBackground = selectionBackground;
        firePropertyChange("selectionBackground", oldValue, selectionBackground);
    
public voidsetSelectionForeground(java.awt.Color selectionForeground)
Sets the color used to draw the foreground of selected items, which cell renderers can use to render text and graphics. {@code DefaultListCellRenderer} uses this color to draw the foreground of items in the selected state, as do the renderers installed by most {@code ListUI} implementations.

The default value of this property is defined by the look and feel implementation.

This is a JavaBeans bound property.

param
selectionForeground the {@code Color} to use in the foreground for selected list items
see
#getSelectionForeground
see
#setSelectionBackground
see
#setForeground
see
#setBackground
see
#setFont
see
DefaultListCellRenderer
beaninfo
bound: true attribute: visualUpdate true description: The foreground color of selected cells.

        Color oldValue = this.selectionForeground;
        this.selectionForeground = selectionForeground;
        firePropertyChange("selectionForeground", oldValue, selectionForeground);
    
public voidsetSelectionInterval(int anchor, int lead)
Selects the specified interval. Both {@code anchor} and {@code lead} indices are included. {@code anchor} doesn't have to be less than or equal to {@code lead}. This is a cover method that delegates to the method of the same name on the list's selection model.

Refer to the documentation of the selection model class being used for details on how values less than {@code 0} are handled.

param
anchor the first index to select
param
lead the last index to select
see
ListSelectionModel#setSelectionInterval
see
DefaultListSelectionModel#setSelectionInterval
see
#createSelectionModel
see
#addSelectionInterval
see
#removeSelectionInterval

        getSelectionModel().setSelectionInterval(anchor, lead);
    
public voidsetSelectionMode(int selectionMode)
Sets the selection mode for the list. This is a cover method that sets the selection mode directly on the selection model.

The following list describes the accepted selection modes:

  • {@code ListSelectionModel.SINGLE_SELECTION} - Only one list index can be selected at a time. In this mode, {@code setSelectionInterval} and {@code addSelectionInterval} are equivalent, both replacing the current selection with the index represented by the second argument (the "lead").
  • {@code ListSelectionModel.SINGLE_INTERVAL_SELECTION} - Only one contiguous interval can be selected at a time. In this mode, {@code addSelectionInterval} behaves like {@code setSelectionInterval} (replacing the current selection}, unless the given interval is immediately adjacent to or overlaps the existing selection, and can be used to grow the selection.
  • {@code ListSelectionModel.MULTIPLE_INTERVAL_SELECTION} - In this mode, there's no restriction on what can be selected. This mode is the default.

param
selectionMode the selection mode
see
#getSelectionMode
throws
IllegalArgumentException if the selection mode isn't one of those allowed
beaninfo
description: The selection mode. enum: SINGLE_SELECTION ListSelectionModel.SINGLE_SELECTION SINGLE_INTERVAL_SELECTION ListSelectionModel.SINGLE_INTERVAL_SELECTION MULTIPLE_INTERVAL_SELECTION ListSelectionModel.MULTIPLE_INTERVAL_SELECTION

        getSelectionModel().setSelectionMode(selectionMode);
    
public voidsetSelectionModel(javax.swing.ListSelectionModel selectionModel)
Sets the selectionModel for the list to a non-null ListSelectionModel implementation. The selection model handles the task of making single selections, selections of contiguous ranges, and non-contiguous selections.

This is a JavaBeans bound property.

param
selectionModel the ListSelectionModel that implements the selections
exception
IllegalArgumentException if selectionModel is null
see
#getSelectionModel
beaninfo
bound: true description: The selection model, recording which cells are selected.

        if (selectionModel == null) {
            throw new IllegalArgumentException("selectionModel must be non null");
        }

        /* Remove the forwarding ListSelectionListener from the old
         * selectionModel, and add it to the new one, if necessary.
         */
        if (selectionListener != null) {
            this.selectionModel.removeListSelectionListener(selectionListener);
            selectionModel.addListSelectionListener(selectionListener);
        }

        ListSelectionModel oldValue = this.selectionModel;
        this.selectionModel = selectionModel;
        firePropertyChange("selectionModel", oldValue, selectionModel);
    
public voidsetUI(javax.swing.plaf.ListUI ui)
Sets the {@code ListUI}, the look and feel object that renders this component.

param
ui the ListUI object
see
UIDefaults#getUI
beaninfo
bound: true hidden: true attribute: visualUpdate true description: The UI object that implements the Component's LookAndFeel.

        super.setUI(ui);
    
public voidsetValueIsAdjusting(boolean b)
Sets the selection model's {@code valueIsAdjusting} property. When {@code true}, upcoming changes to selection should be considered part of a single change. This property is used internally and developers typically need not call this method. For example, when the model is being updated in response to a user drag, the value of the property is set to {@code true} when the drag is initiated and set to {@code false} when the drag is finished. This allows listeners to update only when a change has been finalized, rather than handling all of the intermediate values.

You may want to use this directly if making a series of changes that should be considered part of a single change.

This is a cover method that delegates to the method of the same name on the list's selection model. See the documentation for {@link javax.swing.ListSelectionModel#setValueIsAdjusting} for more details.

param
b the new value for the property
see
ListSelectionModel#setValueIsAdjusting
see
javax.swing.event.ListSelectionEvent#getValueIsAdjusting
see
#getValueIsAdjusting

        getSelectionModel().setValueIsAdjusting(b);
    
public voidsetVisibleRowCount(int visibleRowCount)
Sets the {@code visibleRowCount} property, which has different meanings depending on the layout orientation: For a {@code VERTICAL} layout orientation, this sets the preferred number of rows to display without requiring scrolling; for other orientations, it affects the wrapping of cells.

In {@code VERTICAL} orientation:
Setting this property affects the return value of the {@link #getPreferredScrollableViewportSize} method, which is used to calculate the preferred size of an enclosing viewport. See that method's documentation for more details.

In {@code HORIZONTAL_WRAP} and {@code VERTICAL_WRAP} orientations:
This affects how cells are wrapped. See the documentation of {@link #setLayoutOrientation} for more details.

The default value of this property is {@code 8}.

Calling this method with a negative value results in the property being set to {@code 0}.

This is a JavaBeans bound property.

param
visibleRowCount an integer specifying the preferred number of rows to display without requiring scrolling
see
#getVisibleRowCount
see
#getPreferredScrollableViewportSize
see
#setLayoutOrientation
see
JComponent#getVisibleRect
see
JViewport
beaninfo
bound: true attribute: visualUpdate true description: The preferred number of rows to display without requiring scrolling

        int oldValue = this.visibleRowCount;
        this.visibleRowCount = Math.max(0, visibleRowCount);
        firePropertyChange("visibleRowCount", oldValue, visibleRowCount);
    
private voidupdateFixedCellSize()

        ListCellRenderer cr = getCellRenderer();
        Object value = getPrototypeCellValue();

        if ((cr != null) && (value != null)) {
            Component c = cr.getListCellRendererComponent(this, value, 0, false, false);

            /* The ListUI implementation will add Component c to its private
             * CellRendererPane however we can't assume that's already
             * been done here.  So we temporarily set the one "inherited"
             * property that may affect the renderer components preferred size:
             * its font.
             */
            Font f = c.getFont();
            c.setFont(getFont());

            Dimension d = c.getPreferredSize();
            fixedCellWidth = d.width;
            fixedCellHeight = d.height;

            c.setFont(f);
        }
    
public voidupdateUI()
Resets the {@code ListUI} property by setting it to the value provided by the current look and feel. If the current cell renderer was installed by the developer (rather than the look and feel itself), this also causes the cell renderer and its children to be updated, by calling {@code SwingUtilities.updateComponentTreeUI} on it.

see
UIManager#getUI
see
SwingUtilities#updateComponentTreeUI

        setUI((ListUI)UIManager.getUI(this));

        ListCellRenderer renderer = getCellRenderer();
        if (renderer instanceof Component) {
            SwingUtilities.updateComponentTreeUI((Component)renderer);
        }
    
private voidwriteObject(java.io.ObjectOutputStream s)

        s.defaultWriteObject();
        if (getUIClassID().equals(uiClassID)) {
            byte count = JComponent.getWriteObjCounter(this);
            JComponent.setWriteObjCounter(this, --count);
            if (count == 0 && ui != null) {
                ui.installUI(this);
            }
        }