<Swing Dev> 6179357: Generics: JList: ListCellRenderer & prototypeCellValue

Alexander Potochkin Alexander.Potochkin at Sun.COM
Fri Mar 6 15:43:23 UTC 2009


Hello Florian

>>
>> Thank you for the constructive examples!
>>
> You're welcome! :-)
>> I looked at the usage of prototypeCellValue property,
>> following the JList.updateFixedCellSize() method
>>
> Yes, this was the reason for this whole discussion: the list entries and 
> the prototypeCellValue use the same ListCellRenderer.
> If both are of type E, both can use a ListCellRenderer<? super E>
> 
>> I found this code in the 
>> DefaultListCellRenderer.getListCellRendererComponent():
>>
>>
>>     if (value instanceof Icon) {
>>         setIcon((Icon)value);
>>         setText("");
>>     }
>>     else {
>>         setIcon(null);
>>         setText((value == null) ? "" : value.toString());
>>     }
>>
>> It means that value always can be an icon,
>> so we need to do something about that
> 
> I already had a short look at DefaultListCellRenderer. I think it has to 
> be specified something like:
> 
> DefaultListCellRenderer implements ListCellRenderer<Object>

it makes sense

> 
> since it works for all Objects (toString() ) and Object is a superclass 
> of Icon. Like this it also fits to ListCellRenderer<? super E> for any 
> given E and thus should be possible to use it as the default 
> cellRenderer of JList (which it probably already is, though I can't 
> check it right now. Somewhere in the UI class?)
> 
> I didn't plan to include DefaultListCellRenderer in the first patch, but 
> can do so, if you prefer.

Yes please

>>
>> I also think that shouldn't generify prototypeCellValue,
>> since it doesn't give as any visible advantage,
> This would be option 1) then, because if prototypeCellValue is of type 
> Object, the ListCellRenderer has to be as well. The value of having a 
> generified prototypeCellValue is that we can use a generified 
> ListCellRenderer!
> 
> I think it would be a pity if we don't provide a generic ListCellRenderer.
>> moreover some programmers may use an object of a special type
>> that toString() method returns something meaningful for 
>> prototypeCellValue
>>
> This is still possible with option 3), eg. with JList<Object> or "raw" 
> JList.

Using the "raw" types is not an option for me,
we should never use raw types of generified objects
or encourage programmers to use them

JList<Object> is fine, so I also vote for the option #3

Thank you
alexp

> 
> -Florian
> 
>> Thanks
>> alexp
>>
>>> Here is a second sample.
>>>
>>> It's not really a  real-world sample, but should be useful to show 
>>> that also JList of other "value" types than String, such as Integer, 
>>> Long and Short, can profit from generics.
>>>
>>> It also shows why JList should specify
>>> ListCellRenderer<? super E> cellRenderer
>>>
>>> rather than
>>>
>>> ListCellRenderer<E> cellRenderer
>>>
>>> (Here: a common Number-cell renderer is used.)
>>>
>>> -Florian
>>>
>>> Am Dienstag, 3. März 2009 schrieb Alexander Potochkin:
>>>> Hello Tom
>>>>
>>>> It's nice to see you here
>>>>
>>>>>> Could you please provide a complete example of a JList
>>>>>> with a custom ListCellRenderer that proves that renderer should be
>>>>>> generified
>>>>> I bet if you used NetBeans to find implementations of ListCellRenderer
>>>>> even within the JDK most useful implementations would cast the value
>>>>> argument.
>>>> anyway, it is always better to have a fixed set of examples to discuss
>>>>
>>>>> (I prefer option 3, btw.)
>>>> Thanks
>>>> alexp
>>>>
>>>>> Tom Hawtin
>>>
>>>
>>
> 




More information about the swing-dev mailing list