<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
Wed Oct 10 06:22:31 UTC 2012


Hi Pavel,
   Thanks for your comment yet.  I will think about it in other way, 
perhaps other way to work around it without api change.

Best regards,
Frank

On 10/9/2012 11:20 PM, pavel porvatov wrote:
> 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