Florian,

Your proposed solution of deprecating the old method and referring to the new method seems like a good idea to me.

Cheers,
Jonathan Giles

Florian Brunner wrote:

Hi,

I hope you all had a Merry Christmas! I started now to add generics to ListModel and JList. While adding generics to the ListModel is quite straightforward, I think, there are some issues with JList, I would like to dicuss. I start here with the first issue: getSelectedValues

Am I right, that there is no way to change the signature of this method to:

public E[] getSelectedValues()

where E is the type parameter of the class?

(Because of generic array creation, which is not supported by Java.)

Here is the current implementation:

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;

}

If this is not possible I propose to add a new method:

public List<E> getSelectedItems()

and deprecate getSelectedValues:

...

* @deprecated As of JDK 1.7, replaced by {...@link #getSelectedItems()}

*/

@Deprecated

public Object[] getSelectedValues() {

...

}

/**

* 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> getSelectedItems() {

ListSelectionModel sm = getSelectionModel();

ListModel<? extends 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;

}

Note: Ignore for now 'E' vs '? extends E', I will start another thread for this. I'm just interested if you think it's a good idea to add the getSelectedItems method and to deprecate getSelectedValues.

So I wish you a Happy New Year and hope to hear from you soon.

-Florian

Reply via email to