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

Pavel Porvatov Pavel.Porvatov at Sun.COM
Wed Mar 11 16:35:06 UTC 2009


Hi Florian,

First of all sorry for delay, I was ill.

> 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.)
It's a bad idea to use prototypeCellValue with a type different from 
other values (IMO). Therefore I'm voting for option #3

Regards, Pavel

> 
> 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