<Swing Dev> 7189299 DefaultButtonModel instance keeps stale listeners of JButton in case of multiple SwingUtilities.updateComponentTreeUI() calls
Frank Ding
dingxmin at linux.vnet.ibm.com
Mon Oct 29 07:48:39 UTC 2012
Hi all,
Seems Pavel has been busy these days. Is anybody willing to review
v5 change?
Thanks,
Frank
On 10/17/2012 1:51 PM, Frank Ding wrote:
> Hi Pavel,
> Thanks for your comment pointing out the problems posed by static
> fields. V4 cannot be an accepted work around unless static fields are
> avoided. But I think in v4 removing stale listeners is only applied
> to those installed by FormView.
> I have revised the approach adopted in v4 where a JButtonWrapper
> class is declared for the purpose of accessing actionListener,
> changeListener and itemListener defined in its base class. In
> addition, overriding setModel method in JButtonWrapper allows us to
> undo registration of aforementioned listeners on the newModel passed
> in as setModel method parameter. In order to have FormView function
> correctly in terms of triggering the actionPerformed method defined in
> FormView, setModel also explicitly add FormView.this as action
> listener to the newModel. Further more, setModel deregisters any
> action listeners of class FormView because that is the stale action
> listener registered by setModel last time. In doing all the tricks in
> setModel, we successfully achieved the goal of removing stale listener
> while making FormView JButton properly function.
>
> By the way, I also updated the jtreg test case bug7189299.java a
> little bit to assert number of item listeners and change listeners
> because in setModel, the default changeListener and itemListener
> pertaining to the JButton are removed as well.
>
> The v5 code review is @
> http://cr.openjdk.java.net/~dingxmin/7189299/webrev.05/
>
> Your review is highly appreciated.
>
> Thanks and best regards,
> Frank
>
> On 10/15/2012 5:16 PM, pavel porvatov wrote:
>> Hi Frank,
>>
>> You are still removing all listeners, not only installed by FormView.
>>
>> You also introduced new static field (private static JButtonWrapper
>> currJButton = null), but there are a lot problems with static fields:
>>
>> 1. Memory leaks: static fields hold reference to potentially huge
>> objects unlimited time
>> 2. Conflicts between applications from different AppContext (e. g.
>> applets)
>> etc.
>>
>> So the best way is to avoid static fields at all.
>>
>> Regards, Pavel
>>
>> Hi Pavel,
>>> I happened to have another way of working around it though
>>> admittedly it's ugly. Actually a good solution instead of a
>>> workaround requires either involving large code modification or
>>> introduction of new api.
>>> Idea of v4 change this time is keeping track of every
>>> JButtonWrapper instance once instantialized so that the listeners
>>> pertaining to stale JButton instance can be de-registered upon new
>>> JButton creation.
>>> You can check out code review below
>>> http://cr.openjdk.java.net/~dingxmin/7189299/webrev.04/
>>>
>>> Your prompt comment is warmly welcomed and expected.
>>>
>>> Best regards,
>>> Frank
>>>
>>>
>>
>
More information about the swing-dev
mailing list