<Swing Dev> 6179357: Generics: JList: getSelectedValues
Pavel Porvatov
Pavel.Porvatov at Sun.COM
Mon Jan 19 16:15:56 UTC 2009
Hi Florian,
> So, does everybody agree?
>
> Would be great to also have opinions from someone working at Sun?
>
> Pavel, especially your opinion is quite important since you will probably be
> the one who will have to eventually accept and commit my patch. :-)
I think we are not able to do anything with the getSelectedValues()
method. So we should introduce the new method and deprecate the old one.
Regards, Pavel.
>
> -Florian
>
> Am Dienstag, 30. Dezember 2008 schrieb Jonathan Giles:
>> 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
>
>
More information about the swing-dev
mailing list