| Method from javax.swing.JList Detail: |
public void addListSelectionListener(ListSelectionListener listener) {
if (selectionListener == null) {
selectionListener = new ListSelectionHandler();
getSelectionModel().addListSelectionListener(selectionListener);
}
listenerList.add(ListSelectionListener.class, 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. |
public void addSelectionInterval(int anchor,
int lead) {
getSelectionModel().addSelectionInterval(anchor, 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. |
public void clearSelection() {
getSelectionModel().clearSelection();
}
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. |
protected ListSelectionModel createSelectionModel() {
return new DefaultListSelectionModel();
}
Returns an instance of {@code DefaultListSelectionModel}; called
during construction to initialize the list's selection model
property. |
JList.DropLocation dropLocationForPoint(Point p) {
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;
}
Calculates a drop location in this component, representing where a
drop at the given point should insert data. |
public void ensureIndexIsVisible(int index) {
Rectangle cellBounds = getCellBounds(index, index);
if (cellBounds != null) {
scrollRectToVisible(cellBounds);
}
}
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. |
protected void fireSelectionValueChanged(int firstIndex,
int lastIndex,
boolean isAdjusting) {
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);
}
}
}
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}. |
public AccessibleContext getAccessibleContext() {
if (accessibleContext == null) {
accessibleContext = new AccessibleJList();
}
return accessibleContext;
}
|
public int getAnchorSelectionIndex() {
return getSelectionModel().getAnchorSelectionIndex();
}
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. |
public Rectangle getCellBounds(int index0,
int index1) {
ListUI ui = getUI();
return (ui != null) ? ui.getCellBounds(this, index0, index1) : null;
}
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}. |
public ListCellRenderer getCellRenderer() {
return cellRenderer;
}
Returns the object responsible for painting list items. |
public boolean getDragEnabled() {
return dragEnabled;
}
Returns whether or not automatic drag handling is enabled. |
public final JList.DropLocation getDropLocation() {
return dropLocation;
}
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. |
public final DropMode getDropMode() {
return dropMode;
}
Returns the drop mode for this component. |
public int getFirstVisibleIndex() {
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;
}
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. |
public int getFixedCellHeight() {
return fixedCellHeight;
}
Returns the value of the {@code fixedCellHeight} property. |
public int getFixedCellWidth() {
return fixedCellWidth;
}
Returns the value of the {@code fixedCellWidth} property. |
public int getLastVisibleIndex() {
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;
}
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. |
public int getLayoutOrientation() {
return layoutOrientation;
}
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. |
public int getLeadSelectionIndex() {
return getSelectionModel().getLeadSelectionIndex();
}
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. |
public ListSelectionListener[] getListSelectionListeners() {
return (ListSelectionListener[])listenerList.getListeners(
ListSelectionListener.class);
}
Returns an array of all the {@code ListSelectionListener}s added
to this {@code JList} by way of {@code addListSelectionListener}. |
public int getMaxSelectionIndex() {
return getSelectionModel().getMaxSelectionIndex();
}
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. |
public int getMinSelectionIndex() {
return getSelectionModel().getMinSelectionIndex();
}
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. |
public ListModel getModel() {
return dataModel;
}
Returns the data model that holds the list of items displayed
by the JList component. |
public int getNextMatch(String prefix,
int startIndex,
Position.Bias bias) {
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;
}
Returns the next list element whose {@code toString} value
starts with the given prefix. |
public Dimension getPreferredScrollableViewportSize() {
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);
}
}
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. |
public Object getPrototypeCellValue() {
return prototypeCellValue;
}
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. |
public int getScrollableBlockIncrement(Rectangle visibleRect,
int orientation,
int direction) {
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;
}
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()}. |
public boolean getScrollableTracksViewportHeight() {
if (getLayoutOrientation() == VERTICAL_WRAP &&
getVisibleRowCount() < = 0) {
return true;
}
if (getParent() instanceof JViewport) {
return (((JViewport)getParent()).getHeight() > getPreferredSize().height);
}
return false;
}
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}. |
public boolean getScrollableTracksViewportWidth() {
if (getLayoutOrientation() == HORIZONTAL_WRAP &&
getVisibleRowCount() < = 0) {
return true;
}
if (getParent() instanceof JViewport) {
return (((JViewport)getParent()).getWidth() > getPreferredSize().width);
}
return false;
}
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}. |
public int getScrollableUnitIncrement(Rectangle visibleRect,
int orientation,
int direction) {
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;
}
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}). |
public int getSelectedIndex() {
return getMinSelectionIndex();
}
|
public int[] getSelectedIndices() {
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;
}
Returns an array of all of the selected indices, in increasing
order. |
public Object getSelectedValue() {
int i = getMinSelectionIndex();
return (i == -1) ? null : getModel().getElementAt(i);
}
|
public Object[] getSelectedValues() {
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;
}
Returns an array of all the selected values, in increasing order based
on their indices in the list. |
public Color getSelectionBackground() {
return selectionBackground;
}
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. |
public Color getSelectionForeground() {
return selectionForeground;
}
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. |
public int getSelectionMode() {
return getSelectionModel().getSelectionMode();
}
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. |
public ListSelectionModel getSelectionModel() {
return selectionModel;
}
Returns the current selection model. The selection model maintains the
selection state of the list. See the class level documentation for more
details. |
public String getToolTipText(MouseEvent event) {
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();
}
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. |
public ListUI getUI() {
return (ListUI)ui;
}
Returns the {@code ListUI}, the look and feel object that
renders this component. |
public String getUIClassID() {
return uiClassID;
}
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. |
public boolean getValueIsAdjusting() {
return getSelectionModel().getValueIsAdjusting();
}
|
public int getVisibleRowCount() {
return visibleRowCount;
}
Returns the value of the {@code visibleRowCount} property. See the
documentation for #setVisibleRowCount for details on how to
interpret this value. |
public Point indexToLocation(int index) {
ListUI ui = getUI();
return (ui != null) ? ui.indexToLocation(this, index) : null;
}
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}. |
public boolean isSelectedIndex(int index) {
return getSelectionModel().isSelectedIndex(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. |
public boolean isSelectionEmpty() {
return getSelectionModel().isSelectionEmpty();
}
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. |
public int locationToIndex(Point location) {
ListUI ui = getUI();
return (ui != null) ? ui.locationToIndex(this, location) : -1;
}
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}. |
protected String paramString() {
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;
}
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}. |
public void removeListSelectionListener(ListSelectionListener listener) {
listenerList.remove(ListSelectionListener.class, listener);
}
Removes a selection listener from the list. |
public void removeSelectionInterval(int index0,
int index1) {
getSelectionModel().removeSelectionInterval(index0, 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. |
public void setCellRenderer(ListCellRenderer cellRenderer) {
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);
}
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. |
public void setDragEnabled(boolean b) {
if (b && GraphicsEnvironment.isHeadless()) {
throw new HeadlessException();
}
dragEnabled = 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}. |
Object setDropLocation(TransferHandler.DropLocation location,
Object state,
boolean forDrop) {
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;
}
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. |
public final void setDropMode(DropMode dropMode) {
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 void setFixedCellHeight(int height) {
int oldValue = fixedCellHeight;
fixedCellHeight = height;
firePropertyChange("fixedCellHeight", oldValue, fixedCellHeight);
}
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. |
public void setFixedCellWidth(int width) {
int oldValue = fixedCellWidth;
fixedCellWidth = width;
firePropertyChange("fixedCellWidth", oldValue, fixedCellWidth);
}
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. |
public void setLayoutOrientation(int layoutOrientation) {
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");
}
}
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. |
public void setListData(Object[] listData) {
setModel (
new AbstractListModel() {
public int getSize() { return listData.length; }
public Object getElementAt(int i) { return listData[i]; }
}
);
}
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. |
public void setListData(Vector listData) {
setModel (
new AbstractListModel() {
public int getSize() { return listData.size(); }
public Object getElementAt(int i) { return listData.elementAt(i); }
}
);
}
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. |
public void setModel(ListModel model) {
if (model == null) {
throw new IllegalArgumentException("model must be non null");
}
ListModel oldValue = dataModel;
dataModel = model;
firePropertyChange("model", oldValue, dataModel);
clearSelection();
}
|
public void setPrototypeCellValue(Object prototypeCellValue) {
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);
}
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. |
public void setSelectedIndex(int index) {
if (index >= getModel().getSize()) {
return;
}
getSelectionModel().setSelectionInterval(index, 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. |
public void setSelectedIndices(int[] indices) {
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]);
}
}
}
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. |
public void setSelectedValue(Object anObject,
boolean shouldScroll) {
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**/
}
Selects the specified object from the list. |
public void setSelectionBackground(Color selectionBackground) {
Color oldValue = this.selectionBackground;
this.selectionBackground = selectionBackground;
firePropertyChange("selectionBackground", oldValue, 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. |
public void setSelectionForeground(Color selectionForeground) {
Color oldValue = this.selectionForeground;
this.selectionForeground = selectionForeground;
firePropertyChange("selectionForeground", oldValue, 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. |
public void setSelectionInterval(int anchor,
int lead) {
getSelectionModel().setSelectionInterval(anchor, 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. |
public void setSelectionMode(int selectionMode) {
getSelectionModel().setSelectionMode(selectionMode);
}
|
public void setSelectionModel(ListSelectionModel selectionModel) {
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 void setUI(ListUI ui) {
super.setUI(ui);
}
Sets the {@code ListUI}, the look and feel object that
renders this component. |
public void setValueIsAdjusting(boolean b) {
getSelectionModel().setValueIsAdjusting(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
javax.swing.ListSelectionModel#setValueIsAdjusting for
more details. |
public void setVisibleRowCount(int visibleRowCount) {
int oldValue = this.visibleRowCount;
this.visibleRowCount = Math.max(0, visibleRowCount);
firePropertyChange("visibleRowCount", oldValue, 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
#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
#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. |
public void updateUI() {
setUI((ListUI)UIManager.getUI(this));
ListCellRenderer renderer = getCellRenderer();
if (renderer instanceof Component) {
SwingUtilities.updateComponentTreeUI((Component)renderer);
}
}
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. |