<Swing Dev> 7189299 DefaultButtonModel instance keeps stale listeners of JButton in case of multiple SwingUtilities.updateComponentTreeUI() calls

pavel porvatov pavel.porvatov at oracle.com
Tue Oct 9 15:20:36 UTC 2012


Hi Frank,
> Hi Pavel,
>   Thanks for you reply.  I have thought it through and have to have 
> this solution.  The pain point is that these private access level 
> listeners are completely encapsulated.  But there is another possible 
> fix that won't bother introducing cleanup api but would require
> 1.  Make ComponentView.setComponentParent method become protected for 
> FormView to override (package level is not adequate because FormView 
> resides under a different package).  This allows FormView instance to 
> determine de-registration condition.
That's public API changing

> 2.  Make ComponentView.c (private Invalidator c) become protected for 
> FormView to access.
That's public API changing as well
>
>  It doesn't bring about new cleanup public api but make hidden 
> setComponentParent and c come to surface.  Do you think it is 
> preferable than cleanup one? 
I believe we should try to find a fix without API changes

> Or I would be more than glad to know another approach.
Unfortunately I don't have time to fix this problem. Does somebody else 
have ideas about the fix?

Regards, Pavel
>
> Best regards,
> Frank
>
> On 10/5/2012 8:39 PM, pavel porvatov wrote:
>> Hi Frank,
>>> Hi Pavel,
>>>   Thanks for your comment.  I improved my fix again and uploaded to 
>>> the following address
>>>   http://cr.openjdk.java.net/~dingxmin/7189299/webrev.03/
>>>
>>>   This revision offers a different approach where
>>> 1.  In ComponentView, setComponentParent method,  the best place 
>>> that is entitled to detect de-registration condition because only in 
>>> class ComponentView can var "Invalidator c" be accessed.
>>> 2.  If the condition is satisfied (this.getParent()==null && 
>>> c.getParent() !=null), call a newly added protected method "cleanup" 
>>> to let subclass do house clean up work.
>>> 3.  FormView.cleanup does the actual work of removing listeners from 
>>> DefaultButtonModel.
>>> 4.  However, listener instances to be de-registered are protected 
>>> members of AbstractButton, we need to have a JButton wrapper 
>>> exposing these listeners, which leads to declaration of 
>>> JButtonWrapper inner class.
>>>
>>>   I think this time is much better than the reflection one. Could 
>>> you please take a took and give your comment?  I may need to refine 
>>> javadoc of cleanup protected method later.
>> You added new method in public API 
>> (javax.swing.text.ComponentView#cleanup). Is it possible to fix the 
>> problem without extending API? I don't think this method will be 
>> useful for other people...
>>
>> Thanks, Pavel
>>>
>>> Thanks and best regards,
>>> Frank
>>>
>>> On 9/13/2012 7:50 PM, Pavel Porvatov wrote:
>>>> Hi Frank,
>>>>> Hi Pavel
>>>>>   It's been a long time since last discussion.  Now I have a new 
>>>>> approach to the issue.
>>>>>   The basic idea is removing the listener pertaining to JButton 
>>>>> instance from DefaultButtonModel when the corresponding FormView 
>>>>> instance is about to retire.
>>>>>
>>>>>   The best place I can find in source code to achieve it is in 
>>>>> FormView's super class ComponentView, method void setComponentParent.
>>>>>   View p = getParent();
>>>>>   if (p != null) {
>>>>>      ....
>>>>>   } else {
>>>>>     // when p is null, it means the FormView instance is about to 
>>>>> retire
>>>>>     // deregister listener off shared DefaultButtonModel instance
>>>>>   }
>>>>>
>>>>>   However, the biggest problem is that the listener to be removed 
>>>>> is a private member of AbstractButton and the only way is holding 
>>>>> the listener object and then calling various removeXXXListener on 
>>>>> DefaultButtonModel with the listener being parameter.  I have to 
>>>>> resort to reflection which makes it look more like a workaround. 
>>>>> What's more, reflection introduces implementation dependency.
>>>>>   In addition to the change to fix, I also updated its jtreg test 
>>>>> case according to your comments.
>>>>>   Could you please review it again @
>>>>> http://cr.openjdk.java.net/~dingxmin/7189299/webrev.02
>>>> We don't use reflection in the SWING library. Could you please try 
>>>> to find another way of fix?
>>>>
>>>> Regards, Pavel
>>>>
>>>
>>
>



More information about the swing-dev mailing list