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

Florian Brunner fbrunnerlist at gmx.ch
Thu Mar 5 19:02:28 UTC 2009


Just to clarify:
The downside of option 3) is that if you want an arbitrary Object as 
prototypeCellValue, then you need to specify something like 
JList<Object> or "raw" JList, and would in this case loose the benefit 
of the generified JList. (If it's another superclass of E, you can limit 
that loss a bit.)

In contrast: with option 1) you can always benefit from a generified 
JList (from the entries getter point of view) but you can never really 
benefit from a generified ListCellRenderer, which would be a pity, I 
think. (Unsafe casts - see the samples)

Option 2) is somewhere in between: you can always benefit from a 
generified JList (from the entries getter-methods point of view -  the 
first parameter) and can sometimes also benefit from a generified 
ListCellRenderer (the second parameter).

-Florian

Florian Brunner schrieb:
> Hi Alexander,
>
> Alexander Potochkin schrieb:
>> 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>
>
> 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.
>>
>> 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.
>
> -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