6823603: Generics: JList
Reviewed-by: peterz, alexp
This commit is contained in:
parent
92cb82eecb
commit
5db737cd4c
@ -42,9 +42,11 @@ import java.util.EventListener;
|
||||
* has been added to the <code>java.beans</code> package.
|
||||
* Please see {@link java.beans.XMLEncoder}.
|
||||
*
|
||||
* @param <E> the type of the elements of this model
|
||||
*
|
||||
* @author Hans Muller
|
||||
*/
|
||||
public abstract class AbstractListModel implements ListModel, Serializable
|
||||
public abstract class AbstractListModel<E> implements ListModel<E>, Serializable
|
||||
{
|
||||
protected EventListenerList listenerList = new EventListenerList();
|
||||
|
||||
|
@ -71,7 +71,7 @@ import sun.swing.DefaultLookup;
|
||||
* @author Hans Muller
|
||||
*/
|
||||
public class DefaultListCellRenderer extends JLabel
|
||||
implements ListCellRenderer, Serializable
|
||||
implements ListCellRenderer<Object>, Serializable
|
||||
{
|
||||
|
||||
/**
|
||||
@ -111,7 +111,7 @@ public class DefaultListCellRenderer extends JLabel
|
||||
}
|
||||
|
||||
public Component getListCellRendererComponent(
|
||||
JList list,
|
||||
JList<?> list,
|
||||
Object value,
|
||||
int index,
|
||||
boolean isSelected,
|
||||
|
@ -48,11 +48,13 @@ import javax.swing.event.*;
|
||||
* has been added to the <code>java.beans</code> package.
|
||||
* Please see {@link java.beans.XMLEncoder}.
|
||||
*
|
||||
* @param <E> the type of the elements of this model
|
||||
*
|
||||
* @author Hans Muller
|
||||
*/
|
||||
public class DefaultListModel extends AbstractListModel
|
||||
public class DefaultListModel<E> extends AbstractListModel<E>
|
||||
{
|
||||
private Vector delegate = new Vector();
|
||||
private Vector<E> delegate = new Vector<E>();
|
||||
|
||||
/**
|
||||
* Returns the number of components in this list.
|
||||
@ -83,7 +85,7 @@ public class DefaultListModel extends AbstractListModel
|
||||
* list
|
||||
* @see #get(int)
|
||||
*/
|
||||
public Object getElementAt(int index) {
|
||||
public E getElementAt(int index) {
|
||||
return delegate.elementAt(index);
|
||||
}
|
||||
|
||||
@ -175,7 +177,7 @@ public class DefaultListModel extends AbstractListModel
|
||||
* @return an enumeration of the components of this list
|
||||
* @see Vector#elements()
|
||||
*/
|
||||
public Enumeration<?> elements() {
|
||||
public Enumeration<E> elements() {
|
||||
return delegate.elements();
|
||||
}
|
||||
|
||||
@ -260,7 +262,7 @@ public class DefaultListModel extends AbstractListModel
|
||||
* @see #get(int)
|
||||
* @see Vector#elementAt(int)
|
||||
*/
|
||||
public Object elementAt(int index) {
|
||||
public E elementAt(int index) {
|
||||
return delegate.elementAt(index);
|
||||
}
|
||||
|
||||
@ -271,7 +273,7 @@ public class DefaultListModel extends AbstractListModel
|
||||
* @return the first component of this list
|
||||
* @see Vector#firstElement()
|
||||
*/
|
||||
public Object firstElement() {
|
||||
public E firstElement() {
|
||||
return delegate.firstElement();
|
||||
}
|
||||
|
||||
@ -283,13 +285,13 @@ public class DefaultListModel extends AbstractListModel
|
||||
* @return the last component of the list
|
||||
* @see Vector#lastElement()
|
||||
*/
|
||||
public Object lastElement() {
|
||||
public E lastElement() {
|
||||
return delegate.lastElement();
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the component at the specified <code>index</code> of this
|
||||
* list to be the specified object. The previous component at that
|
||||
* list to be the specified element. The previous component at that
|
||||
* position is discarded.
|
||||
* <p>
|
||||
* Throws an <code>ArrayIndexOutOfBoundsException</code> if the index
|
||||
@ -300,13 +302,13 @@ public class DefaultListModel extends AbstractListModel
|
||||
* <code>List</code> interface defined in the 1.2 Collections framework.
|
||||
* </blockquote>
|
||||
*
|
||||
* @param obj what the component is to be set to
|
||||
* @param element what the component is to be set to
|
||||
* @param index the specified index
|
||||
* @see #set(int,Object)
|
||||
* @see Vector#setElementAt(Object,int)
|
||||
*/
|
||||
public void setElementAt(Object obj, int index) {
|
||||
delegate.setElementAt(obj, index);
|
||||
public void setElementAt(E element, int index) {
|
||||
delegate.setElementAt(element, index);
|
||||
fireContentsChanged(this, index, index);
|
||||
}
|
||||
|
||||
@ -331,7 +333,7 @@ public class DefaultListModel extends AbstractListModel
|
||||
}
|
||||
|
||||
/**
|
||||
* Inserts the specified object as a component in this list at the
|
||||
* Inserts the specified element as a component in this list at the
|
||||
* specified <code>index</code>.
|
||||
* <p>
|
||||
* Throws an <code>ArrayIndexOutOfBoundsException</code> if the index
|
||||
@ -342,26 +344,26 @@ public class DefaultListModel extends AbstractListModel
|
||||
* <code>List</code> interface defined in the 1.2 Collections framework.
|
||||
* </blockquote>
|
||||
*
|
||||
* @param obj the component to insert
|
||||
* @param element the component to insert
|
||||
* @param index where to insert the new component
|
||||
* @exception ArrayIndexOutOfBoundsException if the index was invalid
|
||||
* @see #add(int,Object)
|
||||
* @see Vector#insertElementAt(Object,int)
|
||||
*/
|
||||
public void insertElementAt(Object obj, int index) {
|
||||
delegate.insertElementAt(obj, index);
|
||||
public void insertElementAt(E element, int index) {
|
||||
delegate.insertElementAt(element, index);
|
||||
fireIntervalAdded(this, index, index);
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds the specified component to the end of this list.
|
||||
*
|
||||
* @param obj the component to be added
|
||||
* @param element the component to be added
|
||||
* @see Vector#addElement(Object)
|
||||
*/
|
||||
public void addElement(Object obj) {
|
||||
public void addElement(E element) {
|
||||
int index = delegate.size();
|
||||
delegate.addElement(obj);
|
||||
delegate.addElement(element);
|
||||
fireIntervalAdded(this, index, index);
|
||||
}
|
||||
|
||||
@ -441,7 +443,7 @@ public class DefaultListModel extends AbstractListModel
|
||||
*
|
||||
* @param index index of element to return
|
||||
*/
|
||||
public Object get(int index) {
|
||||
public E get(int index) {
|
||||
return delegate.elementAt(index);
|
||||
}
|
||||
|
||||
@ -457,8 +459,8 @@ public class DefaultListModel extends AbstractListModel
|
||||
* @param element element to be stored at the specified position
|
||||
* @return the element previously at the specified position
|
||||
*/
|
||||
public Object set(int index, Object element) {
|
||||
Object rv = delegate.elementAt(index);
|
||||
public E set(int index, E element) {
|
||||
E rv = delegate.elementAt(index);
|
||||
delegate.setElementAt(element, index);
|
||||
fireContentsChanged(this, index, index);
|
||||
return rv;
|
||||
@ -474,7 +476,7 @@ public class DefaultListModel extends AbstractListModel
|
||||
* @param index index at which the specified element is to be inserted
|
||||
* @param element element to be inserted
|
||||
*/
|
||||
public void add(int index, Object element) {
|
||||
public void add(int index, E element) {
|
||||
delegate.insertElementAt(element, index);
|
||||
fireIntervalAdded(this, index, index);
|
||||
}
|
||||
@ -488,9 +490,10 @@ public class DefaultListModel extends AbstractListModel
|
||||
* (<code>index < 0 || index >= size()</code>).
|
||||
*
|
||||
* @param index the index of the element to removed
|
||||
* @return the element previously at the specified position
|
||||
*/
|
||||
public Object remove(int index) {
|
||||
Object rv = delegate.elementAt(index);
|
||||
public E remove(int index) {
|
||||
E rv = delegate.elementAt(index);
|
||||
delegate.removeElementAt(index);
|
||||
fireIntervalRemoved(this, index, index);
|
||||
return rv;
|
||||
|
@ -25,11 +25,24 @@
|
||||
|
||||
package javax.swing;
|
||||
|
||||
import java.awt.Color;
|
||||
import java.awt.Component;
|
||||
import java.awt.Cursor;
|
||||
import java.awt.Dimension;
|
||||
import java.awt.Font;
|
||||
import java.awt.FontMetrics;
|
||||
import java.awt.GraphicsEnvironment;
|
||||
import java.awt.HeadlessException;
|
||||
import java.awt.Insets;
|
||||
import java.awt.Point;
|
||||
import java.awt.Rectangle;
|
||||
import java.awt.event.*;
|
||||
import java.awt.*;
|
||||
|
||||
import java.util.Vector;
|
||||
import java.util.Locale;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
import java.beans.PropertyChangeEvent;
|
||||
import java.beans.PropertyChangeListener;
|
||||
@ -59,28 +72,30 @@ import static sun.swing.SwingUtilities2.Section.*;
|
||||
* constructor that automatically builds a read-only {@code ListModel} instance
|
||||
* for you:
|
||||
* <pre>
|
||||
* {@code
|
||||
* // Create a JList that displays strings from an array
|
||||
*
|
||||
* String[] data = {"one", "two", "three", "four"};
|
||||
* JList myList = new JList(data);
|
||||
* JList<String> myList = new JList<String>(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()) {
|
||||
* Vector<Class<?>> superClasses = new Vector<Class<?>>();
|
||||
* Class<JList> rootClass = javax.swing.JList.class;
|
||||
* for(Class<?> cls = rootClass; cls != null; cls = cls.getSuperclass()) {
|
||||
* superClasses.addElement(cls);
|
||||
* }
|
||||
* JList myList = new JList(superClasses);
|
||||
* JList<Class<?>> myList = new JList<Class<?>>(superClasses);
|
||||
*
|
||||
* // The automatically created model is stored in JList's "model"
|
||||
* // property, which you can retrieve
|
||||
*
|
||||
* ListModel model = myList.getModel();
|
||||
* ListModel<Class<?>> model = myList.getModel();
|
||||
* for(int i = 0; i < model.getSize(); i++) {
|
||||
* System.out.println(model.getElementAt(i));
|
||||
* }
|
||||
* }
|
||||
* </pre>
|
||||
* <p>
|
||||
* A {@code ListModel} can be supplied directly to a {@code JList} by way of a
|
||||
@ -103,12 +118,14 @@ import static sun.swing.SwingUtilities2.Section.*;
|
||||
* notifying listeners. For example, a read-only implementation of
|
||||
* {@code AbstractListModel}:
|
||||
* <pre>
|
||||
* {@code
|
||||
* // This list model has about 2^16 elements. Enjoy scrolling.
|
||||
*
|
||||
* ListModel bigData = new AbstractListModel() {
|
||||
* ListModel<String> bigData = new AbstractListModel<String>() {
|
||||
* public int getSize() { return Short.MAX_VALUE; }
|
||||
* public Object getElementAt(int index) { return "Index " + index; }
|
||||
* public String getElementAt(int index) { return "Index " + index; }
|
||||
* };
|
||||
* }
|
||||
* </pre>
|
||||
* <p>
|
||||
* The selection state of a {@code JList} is managed by another separate
|
||||
@ -150,9 +167,10 @@ import static sun.swing.SwingUtilities2.Section.*;
|
||||
* component to render, is installed by the lists's {@code ListUI}. You can
|
||||
* substitute your own renderer using code like this:
|
||||
* <pre>
|
||||
* {@code
|
||||
* // Display an icon and a string for each object in the list.
|
||||
*
|
||||
* class MyCellRenderer extends JLabel implements ListCellRenderer {
|
||||
* class MyCellRenderer extends JLabel implements ListCellRenderer<Object> {
|
||||
* final static ImageIcon longIcon = new ImageIcon("long.gif");
|
||||
* final static ImageIcon shortIcon = new ImageIcon("short.gif");
|
||||
*
|
||||
@ -160,7 +178,7 @@ import static sun.swing.SwingUtilities2.Section.*;
|
||||
* // We just reconfigure the JLabel each time we're called.
|
||||
*
|
||||
* public Component getListCellRendererComponent(
|
||||
* JList list, // the list
|
||||
* JList<?> list, // the list
|
||||
* Object value, // value to display
|
||||
* int index, // cell index
|
||||
* boolean isSelected, // is the cell selected
|
||||
@ -184,6 +202,7 @@ import static sun.swing.SwingUtilities2.Section.*;
|
||||
* }
|
||||
*
|
||||
* myList.setCellRenderer(new MyCellRenderer());
|
||||
* }
|
||||
* </pre>
|
||||
* <p>
|
||||
* Another job for the cell renderer is in helping to determine sizing
|
||||
@ -195,7 +214,8 @@ import static sun.swing.SwingUtilities2.Section.*;
|
||||
* automatically based on a single prototype value:
|
||||
* <a name="prototype_example">
|
||||
* <pre>
|
||||
* JList bigDataList = new JList(bigData);
|
||||
* {@code
|
||||
* JList<String> bigDataList = new JList<String>(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
|
||||
@ -204,6 +224,7 @@ import static sun.swing.SwingUtilities2.Section.*;
|
||||
* // properties.
|
||||
*
|
||||
* bigDataList.setPrototypeCellValue("Index 1234567890");
|
||||
* }
|
||||
* </pre>
|
||||
* <p>
|
||||
* {@code JList} doesn't implement scrolling directly. To create a list that
|
||||
@ -260,13 +281,15 @@ import static sun.swing.SwingUtilities2.Section.*;
|
||||
* @see ListCellRenderer
|
||||
* @see DefaultListCellRenderer
|
||||
*
|
||||
* @param <E> the type of the elements of this list
|
||||
*
|
||||
* @beaninfo
|
||||
* attribute: isContainer false
|
||||
* description: A component which allows for the selection of one or more objects from a list.
|
||||
*
|
||||
* @author Hans Muller
|
||||
*/
|
||||
public class JList extends JComponent implements Scrollable, Accessible
|
||||
public class JList<E> extends JComponent implements Scrollable, Accessible
|
||||
{
|
||||
/**
|
||||
* @see #getUIClassID
|
||||
@ -301,15 +324,15 @@ public class JList extends JComponent implements Scrollable, Accessible
|
||||
private int fixedCellWidth = -1;
|
||||
private int fixedCellHeight = -1;
|
||||
private int horizontalScrollIncrement = -1;
|
||||
private Object prototypeCellValue;
|
||||
private E prototypeCellValue;
|
||||
private int visibleRowCount = 8;
|
||||
private Color selectionForeground;
|
||||
private Color selectionBackground;
|
||||
private boolean dragEnabled;
|
||||
|
||||
private ListSelectionModel selectionModel;
|
||||
private ListModel dataModel;
|
||||
private ListCellRenderer cellRenderer;
|
||||
private ListModel<E> dataModel;
|
||||
private ListCellRenderer<? super E> cellRenderer;
|
||||
private ListSelectionListener selectionListener;
|
||||
|
||||
/**
|
||||
@ -402,7 +425,7 @@ public class JList extends JComponent implements Scrollable, Accessible
|
||||
* @param dataModel the model for the list
|
||||
* @exception IllegalArgumentException if the model is {@code null}
|
||||
*/
|
||||
public JList(ListModel dataModel)
|
||||
public JList(ListModel<E> dataModel)
|
||||
{
|
||||
if (dataModel == null) {
|
||||
throw new IllegalArgumentException("dataModel must be non null");
|
||||
@ -437,12 +460,12 @@ public class JList extends JComponent implements Scrollable, Accessible
|
||||
* @param listData the array of Objects to be loaded into the data model,
|
||||
* {@code non-null}
|
||||
*/
|
||||
public JList(final Object[] listData)
|
||||
public JList(final E[] listData)
|
||||
{
|
||||
this (
|
||||
new AbstractListModel() {
|
||||
new AbstractListModel<E>() {
|
||||
public int getSize() { return listData.length; }
|
||||
public Object getElementAt(int i) { return listData[i]; }
|
||||
public E getElementAt(int i) { return listData[i]; }
|
||||
}
|
||||
);
|
||||
}
|
||||
@ -462,11 +485,11 @@ public class JList extends JComponent implements Scrollable, Accessible
|
||||
* @param listData the <code>Vector</code> to be loaded into the
|
||||
* data model, {@code non-null}
|
||||
*/
|
||||
public JList(final Vector<?> listData) {
|
||||
public JList(final Vector<? extends E> listData) {
|
||||
this (
|
||||
new AbstractListModel() {
|
||||
new AbstractListModel<E>() {
|
||||
public int getSize() { return listData.size(); }
|
||||
public Object getElementAt(int i) { return listData.elementAt(i); }
|
||||
public E getElementAt(int i) { return listData.elementAt(i); }
|
||||
}
|
||||
);
|
||||
}
|
||||
@ -477,9 +500,9 @@ public class JList extends JComponent implements Scrollable, Accessible
|
||||
*/
|
||||
public JList() {
|
||||
this (
|
||||
new AbstractListModel() {
|
||||
new AbstractListModel<E>() {
|
||||
public int getSize() { return 0; }
|
||||
public Object getElementAt(int i) { return "No Data Model"; }
|
||||
public E getElementAt(int i) { throw new IndexOutOfBoundsException("No Data Model"); }
|
||||
}
|
||||
);
|
||||
}
|
||||
@ -526,7 +549,7 @@ public class JList extends JComponent implements Scrollable, Accessible
|
||||
public void updateUI() {
|
||||
setUI((ListUI)UIManager.getUI(this));
|
||||
|
||||
ListCellRenderer renderer = getCellRenderer();
|
||||
ListCellRenderer<? super E> renderer = getCellRenderer();
|
||||
if (renderer instanceof Component) {
|
||||
SwingUtilities.updateComponentTreeUI((Component)renderer);
|
||||
}
|
||||
@ -560,8 +583,8 @@ public class JList extends JComponent implements Scrollable, Accessible
|
||||
*/
|
||||
private void updateFixedCellSize()
|
||||
{
|
||||
ListCellRenderer cr = getCellRenderer();
|
||||
Object value = getPrototypeCellValue();
|
||||
ListCellRenderer<? super E> cr = getCellRenderer();
|
||||
E value = getPrototypeCellValue();
|
||||
|
||||
if ((cr != null) && (value != null)) {
|
||||
Component c = cr.getListCellRendererComponent(this, value, 0, false, false);
|
||||
@ -592,7 +615,7 @@ public class JList extends JComponent implements Scrollable, Accessible
|
||||
* @return the value of the {@code prototypeCellValue} property
|
||||
* @see #setPrototypeCellValue
|
||||
*/
|
||||
public Object getPrototypeCellValue() {
|
||||
public E getPrototypeCellValue() {
|
||||
return prototypeCellValue;
|
||||
}
|
||||
|
||||
@ -632,8 +655,8 @@ public class JList extends JComponent implements Scrollable, Accessible
|
||||
* attribute: visualUpdate true
|
||||
* description: The cell prototype value, used to compute cell width and height.
|
||||
*/
|
||||
public void setPrototypeCellValue(Object prototypeCellValue) {
|
||||
Object oldValue = this.prototypeCellValue;
|
||||
public void setPrototypeCellValue(E prototypeCellValue) {
|
||||
E oldValue = this.prototypeCellValue;
|
||||
this.prototypeCellValue = prototypeCellValue;
|
||||
|
||||
/* If the prototypeCellValue has changed and is non-null,
|
||||
@ -727,7 +750,7 @@ public class JList extends JComponent implements Scrollable, Accessible
|
||||
* @see #setCellRenderer
|
||||
*/
|
||||
@Transient
|
||||
public ListCellRenderer getCellRenderer() {
|
||||
public ListCellRenderer<? super E> getCellRenderer() {
|
||||
return cellRenderer;
|
||||
}
|
||||
|
||||
@ -755,8 +778,8 @@ public class JList extends JComponent implements Scrollable, Accessible
|
||||
* attribute: visualUpdate true
|
||||
* description: The component used to draw the cells.
|
||||
*/
|
||||
public void setCellRenderer(ListCellRenderer cellRenderer) {
|
||||
ListCellRenderer oldValue = this.cellRenderer;
|
||||
public void setCellRenderer(ListCellRenderer<? super E> cellRenderer) {
|
||||
ListCellRenderer<? super E> oldValue = this.cellRenderer;
|
||||
this.cellRenderer = cellRenderer;
|
||||
|
||||
/* If the cellRenderer has changed and prototypeCellValue
|
||||
@ -1455,7 +1478,7 @@ public class JList extends JComponent implements Scrollable, Accessible
|
||||
* @since 1.4
|
||||
*/
|
||||
public int getNextMatch(String prefix, int startIndex, Position.Bias bias) {
|
||||
ListModel model = getModel();
|
||||
ListModel<E> model = getModel();
|
||||
int max = model.getSize();
|
||||
if (prefix == null) {
|
||||
throw new IllegalArgumentException();
|
||||
@ -1469,16 +1492,16 @@ public class JList extends JComponent implements Scrollable, Accessible
|
||||
int increment = (bias == Position.Bias.Forward) ? 1 : -1;
|
||||
int index = startIndex;
|
||||
do {
|
||||
Object o = model.getElementAt(index);
|
||||
E element = model.getElementAt(index);
|
||||
|
||||
if (o != null) {
|
||||
if (element != null) {
|
||||
String string;
|
||||
|
||||
if (o instanceof String) {
|
||||
string = ((String)o).toUpperCase();
|
||||
if (element instanceof String) {
|
||||
string = ((String)element).toUpperCase();
|
||||
}
|
||||
else {
|
||||
string = o.toString();
|
||||
string = element.toString();
|
||||
if (string != null) {
|
||||
string = string.toUpperCase();
|
||||
}
|
||||
@ -1516,7 +1539,7 @@ public class JList extends JComponent implements Scrollable, Accessible
|
||||
if(event != null) {
|
||||
Point p = event.getPoint();
|
||||
int index = locationToIndex(p);
|
||||
ListCellRenderer r = getCellRenderer();
|
||||
ListCellRenderer<? super E> r = getCellRenderer();
|
||||
Rectangle cellBounds;
|
||||
|
||||
if (index != -1 && r != null && (cellBounds =
|
||||
@ -1634,7 +1657,7 @@ public class JList extends JComponent implements Scrollable, Accessible
|
||||
* list of items
|
||||
* @see #setModel
|
||||
*/
|
||||
public ListModel getModel() {
|
||||
public ListModel<E> getModel() {
|
||||
return dataModel;
|
||||
}
|
||||
|
||||
@ -1656,11 +1679,11 @@ public class JList extends JComponent implements Scrollable, Accessible
|
||||
* attribute: visualUpdate true
|
||||
* description: The object that contains the data to be drawn by this JList.
|
||||
*/
|
||||
public void setModel(ListModel model) {
|
||||
public void setModel(ListModel<E> model) {
|
||||
if (model == null) {
|
||||
throw new IllegalArgumentException("model must be non null");
|
||||
}
|
||||
ListModel oldValue = dataModel;
|
||||
ListModel<E> oldValue = dataModel;
|
||||
dataModel = model;
|
||||
firePropertyChange("model", oldValue, dataModel);
|
||||
clearSelection();
|
||||
@ -1668,7 +1691,7 @@ public class JList extends JComponent implements Scrollable, Accessible
|
||||
|
||||
|
||||
/**
|
||||
* Constructs a read-only <code>ListModel</code> from an array of objects,
|
||||
* Constructs a read-only <code>ListModel</code> from an array of items,
|
||||
* and calls {@code setModel} with this model.
|
||||
* <p>
|
||||
* Attempts to pass a {@code null} value to this method results in
|
||||
@ -1676,15 +1699,15 @@ public class JList extends JComponent implements Scrollable, Accessible
|
||||
* 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
|
||||
* @param listData an array of {@code E} containing the items to
|
||||
* display in the list
|
||||
* @see #setModel
|
||||
*/
|
||||
public void setListData(final Object[] listData) {
|
||||
public void setListData(final E[] listData) {
|
||||
setModel (
|
||||
new AbstractListModel() {
|
||||
new AbstractListModel<E>() {
|
||||
public int getSize() { return listData.length; }
|
||||
public Object getElementAt(int i) { return listData[i]; }
|
||||
public E getElementAt(int i) { return listData[i]; }
|
||||
}
|
||||
);
|
||||
}
|
||||
@ -1703,11 +1726,11 @@ public class JList extends JComponent implements Scrollable, Accessible
|
||||
* display in the list
|
||||
* @see #setModel
|
||||
*/
|
||||
public void setListData(final Vector<?> listData) {
|
||||
public void setListData(final Vector<? extends E> listData) {
|
||||
setModel (
|
||||
new AbstractListModel() {
|
||||
new AbstractListModel<E>() {
|
||||
public int getSize() { return listData.size(); }
|
||||
public Object getElementAt(int i) { return listData.elementAt(i); }
|
||||
public E getElementAt(int i) { return listData.elementAt(i); }
|
||||
}
|
||||
);
|
||||
}
|
||||
@ -2235,10 +2258,13 @@ public class JList extends JComponent implements Scrollable, Accessible
|
||||
* @see #isSelectedIndex
|
||||
* @see #getModel
|
||||
* @see #addListSelectionListener
|
||||
*
|
||||
* @deprecated As of JDK 1.7, replaced by {@link #getSelectedValuesList()}
|
||||
*/
|
||||
@Deprecated
|
||||
public Object[] getSelectedValues() {
|
||||
ListSelectionModel sm = getSelectionModel();
|
||||
ListModel dm = getModel();
|
||||
ListModel<E> dm = getModel();
|
||||
|
||||
int iMin = sm.getMinSelectionIndex();
|
||||
int iMax = sm.getMaxSelectionIndex();
|
||||
@ -2259,6 +2285,37 @@ public class JList extends JComponent implements Scrollable, Accessible
|
||||
return rv;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a list of all the selected items, in increasing order based
|
||||
* on their indices in the list.
|
||||
*
|
||||
* @return the selected items, or an empty list if nothing is selected
|
||||
* @see #isSelectedIndex
|
||||
* @see #getModel
|
||||
* @see #addListSelectionListener
|
||||
*
|
||||
* @since 1.7
|
||||
*/
|
||||
public List<E> getSelectedValuesList() {
|
||||
ListSelectionModel sm = getSelectionModel();
|
||||
ListModel<E> dm = getModel();
|
||||
|
||||
int iMin = sm.getMinSelectionIndex();
|
||||
int iMax = sm.getMaxSelectionIndex();
|
||||
|
||||
if ((iMin < 0) || (iMax < 0)) {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
|
||||
List<E> selectedItems = new ArrayList<E>();
|
||||
for(int i = iMin; i <= iMax; i++) {
|
||||
if (sm.isSelectedIndex(i)) {
|
||||
selectedItems.add(dm.getElementAt(i));
|
||||
}
|
||||
}
|
||||
return selectedItems;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Returns the smallest selected cell index; <i>the selection</i> when only
|
||||
@ -2291,7 +2348,7 @@ public class JList extends JComponent implements Scrollable, Accessible
|
||||
* @see #getModel
|
||||
* @see #addListSelectionListener
|
||||
*/
|
||||
public Object getSelectedValue() {
|
||||
public E getSelectedValue() {
|
||||
int i = getMinSelectionIndex();
|
||||
return (i == -1) ? null : getModel().getElementAt(i);
|
||||
}
|
||||
@ -2309,7 +2366,7 @@ public class JList extends JComponent implements Scrollable, Accessible
|
||||
setSelectedIndex(-1);
|
||||
else if(!anObject.equals(getSelectedValue())) {
|
||||
int i,c;
|
||||
ListModel dm = getModel();
|
||||
ListModel<E> dm = getModel();
|
||||
for(i=0,c=dm.getSize();i<c;i++)
|
||||
if(anObject.equals(dm.getElementAt(i))){
|
||||
setSelectedIndex(i);
|
||||
@ -3138,14 +3195,14 @@ public class JList extends JComponent implements Scrollable, Accessible
|
||||
*/
|
||||
protected class AccessibleJListChild extends AccessibleContext
|
||||
implements Accessible, AccessibleComponent {
|
||||
private JList parent = null;
|
||||
private JList<E> parent = null;
|
||||
private int indexInParent;
|
||||
private Component component = null;
|
||||
private AccessibleContext accessibleContext = null;
|
||||
private ListModel listModel;
|
||||
private ListCellRenderer cellRenderer = null;
|
||||
private ListModel<E> listModel;
|
||||
private ListCellRenderer<? super E> cellRenderer = null;
|
||||
|
||||
public AccessibleJListChild(JList parent, int indexInParent) {
|
||||
public AccessibleJListChild(JList<E> parent, int indexInParent) {
|
||||
this.parent = parent;
|
||||
this.setAccessibleParent(parent);
|
||||
this.indexInParent = indexInParent;
|
||||
@ -3175,7 +3232,7 @@ public class JList extends JComponent implements Scrollable, Accessible
|
||||
if ((parent != null)
|
||||
&& (listModel != null)
|
||||
&& cellRenderer != null) {
|
||||
Object value = listModel.getElementAt(index);
|
||||
E value = listModel.getElementAt(index);
|
||||
boolean isSelected = parent.isSelectedIndex(index);
|
||||
boolean isFocussed = parent.isFocusOwner()
|
||||
&& (index == parent.getLeadSelectionIndex());
|
||||
|
@ -33,12 +33,13 @@ import java.awt.Component;
|
||||
* the cells in a JList. For example, to use a JLabel as a
|
||||
* ListCellRenderer, you would write something like this:
|
||||
* <pre>
|
||||
* class MyCellRenderer extends JLabel implements ListCellRenderer {
|
||||
* {@code
|
||||
* class MyCellRenderer extends JLabel implements ListCellRenderer<Object> {
|
||||
* public MyCellRenderer() {
|
||||
* setOpaque(true);
|
||||
* }
|
||||
*
|
||||
* public Component getListCellRendererComponent(JList list,
|
||||
* public Component getListCellRendererComponent(JList<?> list,
|
||||
* Object value,
|
||||
* int index,
|
||||
* boolean isSelected,
|
||||
@ -75,14 +76,17 @@ import java.awt.Component;
|
||||
* return this;
|
||||
* }
|
||||
* }
|
||||
* }
|
||||
* </pre>
|
||||
*
|
||||
* @param <E> the type of values this renderer can be used for
|
||||
*
|
||||
* @see JList
|
||||
* @see DefaultListCellRenderer
|
||||
*
|
||||
* @author Hans Muller
|
||||
*/
|
||||
public interface ListCellRenderer
|
||||
public interface ListCellRenderer<E>
|
||||
{
|
||||
/**
|
||||
* Return a component that has been configured to display the specified
|
||||
@ -104,8 +108,8 @@ public interface ListCellRenderer
|
||||
* @see ListModel
|
||||
*/
|
||||
Component getListCellRendererComponent(
|
||||
JList list,
|
||||
Object value,
|
||||
JList<? extends E> list,
|
||||
E value,
|
||||
int index,
|
||||
boolean isSelected,
|
||||
boolean cellHasFocus);
|
||||
|
@ -35,10 +35,12 @@ import javax.swing.event.ListDataListener;
|
||||
* length of the data model must be reported to all of the
|
||||
* ListDataListeners.
|
||||
*
|
||||
* @param <E> the type of the elements of this model
|
||||
*
|
||||
* @author Hans Muller
|
||||
* @see JList
|
||||
*/
|
||||
public interface ListModel
|
||||
public interface ListModel<E>
|
||||
{
|
||||
/**
|
||||
* Returns the length of the list.
|
||||
@ -51,7 +53,7 @@ public interface ListModel
|
||||
* @param index the requested index
|
||||
* @return the value at <code>index</code>
|
||||
*/
|
||||
Object getElementAt(int index);
|
||||
E getElementAt(int index);
|
||||
|
||||
/**
|
||||
* Adds a listener to the list that's notified each time a change
|
||||
|
247
jdk/test/javax/swing/JList/6823603/bug6823603.java
Normal file
247
jdk/test/javax/swing/JList/6823603/bug6823603.java
Normal file
@ -0,0 +1,247 @@
|
||||
/*
|
||||
* Copyright 2009 Sun Microsystems, Inc. All Rights Reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
|
||||
* CA 95054 USA or visit www.sun.com if you need additional information or
|
||||
* have any questions.
|
||||
*/
|
||||
|
||||
/* @test
|
||||
@bug 6823603
|
||||
@summary Generics: JList
|
||||
@author Florian Brunner
|
||||
@run main bug6823603
|
||||
*/
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.Vector;
|
||||
import java.util.Enumeration;
|
||||
import java.awt.*;
|
||||
import javax.swing.*;
|
||||
|
||||
public class bug6823603 {
|
||||
|
||||
private static final String TEST_ELEMENT = "Test1";
|
||||
|
||||
/**
|
||||
* @param args the command line arguments
|
||||
*/
|
||||
@SuppressWarnings("unchecked")
|
||||
public static void main(String[] args) {
|
||||
testRawSignatures();
|
||||
testGenericSignatures();
|
||||
|
||||
testGetSelectedValuesList(); // new method
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
private static void testRawSignatures() {
|
||||
// Test JList
|
||||
ListModel rawTestModel = new DefaultListModel();
|
||||
|
||||
new JList();
|
||||
new JList(rawTestModel);
|
||||
new JList(new Object[]{TEST_ELEMENT});
|
||||
JList rawTestList = new JList(new Vector());
|
||||
rawTestList.getPrototypeCellValue();
|
||||
rawTestList.setPrototypeCellValue(TEST_ELEMENT);
|
||||
rawTestList.getCellRenderer();
|
||||
rawTestList.setCellRenderer(new DefaultListCellRenderer());
|
||||
rawTestList.getModel();
|
||||
rawTestList.setModel(rawTestModel);
|
||||
rawTestList.setListData(new Object[]{TEST_ELEMENT});
|
||||
rawTestList.setListData(new Vector());
|
||||
|
||||
@SuppressWarnings("deprecation")
|
||||
Object[] selectedValues = rawTestList.getSelectedValues();
|
||||
rawTestList.getSelectedValue();
|
||||
|
||||
// Test ListCellRenderer
|
||||
ListCellRenderer rawTestCellRenderer = new DefaultListCellRenderer();
|
||||
String testEntry = "Test";
|
||||
@SuppressWarnings("unchecked")
|
||||
JList rawJList = new JList(new Object[]{testEntry});
|
||||
|
||||
rawTestCellRenderer.getListCellRendererComponent(rawJList,
|
||||
testEntry, 0, true, true);
|
||||
|
||||
// Test ListModel
|
||||
DefaultListModel testModel = new DefaultListModel();
|
||||
testModel.addElement(TEST_ELEMENT);
|
||||
rawTestModel = testModel;
|
||||
rawTestModel.getElementAt(0);
|
||||
|
||||
// Test DefaultListModel
|
||||
DefaultListModel defaultListModel = new DefaultListModel();
|
||||
|
||||
defaultListModel.addElement(TEST_ELEMENT);
|
||||
defaultListModel.getElementAt(0);
|
||||
defaultListModel.elements();
|
||||
defaultListModel.elementAt(0);
|
||||
defaultListModel.firstElement();
|
||||
defaultListModel.lastElement();
|
||||
|
||||
String testElement2 = "Test2";
|
||||
|
||||
defaultListModel.setElementAt(testElement2, 0);
|
||||
defaultListModel.insertElementAt(TEST_ELEMENT, 0);
|
||||
defaultListModel.get(0);
|
||||
defaultListModel.set(0, testElement2);
|
||||
defaultListModel.add(0, TEST_ELEMENT);
|
||||
defaultListModel.remove(0);
|
||||
|
||||
// Test AbstractListModel
|
||||
@SuppressWarnings("serial")
|
||||
ListModel abstractListModel = new AbstractListModel() {
|
||||
public int getSize() {
|
||||
throw new UnsupportedOperationException("Not supported yet.");
|
||||
}
|
||||
|
||||
public Object getElementAt(int index) {
|
||||
throw new UnsupportedOperationException("Not supported yet.");
|
||||
}
|
||||
};
|
||||
|
||||
// Test DefaultListCellRenderer
|
||||
DefaultListCellRenderer cellRenderer = new DefaultListCellRenderer();
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
JList list = new JList(new Object[]{testEntry});
|
||||
|
||||
cellRenderer.getListCellRendererComponent(rawJList, testEntry, 0, true, true);
|
||||
}
|
||||
|
||||
private static <E> void testGenericSignatures() {
|
||||
// Test JList
|
||||
ListModel<String> stringListModel = new DefaultListModel<String>();
|
||||
|
||||
new JList<String>();
|
||||
new JList<String>(stringListModel);
|
||||
new JList<String>(new String[]{TEST_ELEMENT});
|
||||
|
||||
JList<String> stringTestList = new JList<String>(new Vector<String>());
|
||||
|
||||
stringTestList.getPrototypeCellValue();
|
||||
stringTestList.setPrototypeCellValue(TEST_ELEMENT);
|
||||
|
||||
ListCellRenderer<? super String> cellRenderer = stringTestList.getCellRenderer();
|
||||
|
||||
stringTestList.setCellRenderer(new DefaultListCellRenderer());
|
||||
|
||||
ListModel<String> model = stringTestList.getModel();
|
||||
|
||||
stringTestList.setModel(stringListModel);
|
||||
stringTestList.setListData(new String[]{TEST_ELEMENT});
|
||||
stringTestList.setListData(new Vector<String>());
|
||||
|
||||
@SuppressWarnings("deprecation")
|
||||
Object[] selectedValues = stringTestList.getSelectedValues();
|
||||
|
||||
stringTestList.getSelectedValue();
|
||||
|
||||
// Test ListCellRenderer
|
||||
ListCellRenderer<Object> stringTestCellRenderer =
|
||||
new DefaultListCellRenderer();
|
||||
String testEntry = "Test";
|
||||
JList<String> stringJList = new JList<String>(new String[]{testEntry});
|
||||
|
||||
Component listCellRendererComponent2 =
|
||||
stringTestCellRenderer.getListCellRendererComponent(stringJList,
|
||||
testEntry, 0, true, true);
|
||||
|
||||
// Test ListModel
|
||||
DefaultListModel<String> testModel = new DefaultListModel<String>();
|
||||
testModel.addElement(TEST_ELEMENT);
|
||||
stringListModel = testModel;
|
||||
|
||||
String element1 = stringListModel.getElementAt(0);
|
||||
|
||||
// Test DefaultListModel
|
||||
DefaultListModel<String> stringTestModel = new DefaultListModel<String>();
|
||||
|
||||
stringTestModel.addElement(TEST_ELEMENT);
|
||||
element1 = stringTestModel.getElementAt(0);
|
||||
Enumeration<String> elements = stringTestModel.elements();
|
||||
String element2 = stringTestModel.elementAt(0);
|
||||
String firstElement = stringTestModel.firstElement();
|
||||
String lastElement = stringTestModel.lastElement();
|
||||
|
||||
String testElement2 = "Test2";
|
||||
stringTestModel.setElementAt(testElement2, 0);
|
||||
stringTestModel.insertElementAt(TEST_ELEMENT, 0);
|
||||
String element3 = stringTestModel.get(0);
|
||||
String element4 = stringTestModel.set(0, testElement2);
|
||||
stringTestModel.add(0, TEST_ELEMENT);
|
||||
String removedElement = stringTestModel.remove(0);
|
||||
|
||||
// Test AbstractListModel
|
||||
stringListModel = new AbstractListModel<String>() {
|
||||
|
||||
public int getSize() {
|
||||
throw new UnsupportedOperationException("Not supported yet.");
|
||||
}
|
||||
|
||||
public String getElementAt(int index) {
|
||||
throw new UnsupportedOperationException("Not supported yet.");
|
||||
}
|
||||
};
|
||||
|
||||
@SuppressWarnings("serial")
|
||||
ListModel<E> genericTestModel = new AbstractListModel<E>() {
|
||||
|
||||
public int getSize() {
|
||||
throw new UnsupportedOperationException("Not supported yet.");
|
||||
}
|
||||
|
||||
public E getElementAt(int index) {
|
||||
throw new UnsupportedOperationException("Not supported yet.");
|
||||
}
|
||||
};
|
||||
|
||||
// Test DefaultListCellRenderer
|
||||
cellRenderer = new DefaultListCellRenderer();
|
||||
|
||||
stringJList = new JList<String>(new String[]{testEntry});
|
||||
|
||||
listCellRendererComponent2 = cellRenderer.getListCellRendererComponent(stringJList, testEntry, 0, true, true);
|
||||
}
|
||||
|
||||
private static void testGetSelectedValuesList() {
|
||||
Vector<Integer> data = new Vector<Integer>();
|
||||
for (int i = 0; i < 10; i++) {
|
||||
data.add(i);
|
||||
}
|
||||
JList<Integer> list = new JList<Integer>(data);
|
||||
list.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
|
||||
list.setSelectedIndices(new int[]{1, 2, 3, 5, 6, 8});
|
||||
|
||||
@SuppressWarnings("deprecation")
|
||||
Object[] expectedSelectedValues = list.getSelectedValues();
|
||||
List<Integer> selectedValuesList = list.getSelectedValuesList();
|
||||
assertEquals(expectedSelectedValues, selectedValuesList.toArray());
|
||||
}
|
||||
|
||||
private static void assertEquals(Object[] expectedArray,
|
||||
Object[] actualArray) {
|
||||
if (!Arrays.equals(expectedArray, actualArray)) {
|
||||
throw new RuntimeException("Expected: " + Arrays.toString(
|
||||
expectedArray) + " but was: " + Arrays.toString(actualArray));
|
||||
}
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user