Thanks Alexandr. So far Alexandr is the only reviewer of this. I'd like one more.
Thanks, Pete On 5/23/14 5:34 AM, Alexander Scherbatiy wrote: > On 5/22/2014 9:59 PM, Pete Brunet wrote: >> I'd like one more reviewer of this fix. >> >> Also I removed the @Deprecated and will deal with this in a following >> JBS issue. >> >> http://cr.openjdk.java.net/~ptbrunet/JDK-8009883/webrev.04/ > > The fix looks good for me. > > Thanks, > Alexandr. > >> >> Pete >> >> On 5/21/14 10:08 AM, Pete Brunet wrote: >>> On 5/21/14 7:04 AM, Alexander Scherbatiy wrote: >>>> On 5/21/2014 2:56 PM, Alexander Scherbatiy wrote: >>>>> On 5/20/2014 1:10 AM, Pete Brunet wrote: >>>>>> On 5/16/14 11:04 AM, Pete Brunet wrote: >>>>>>> On 5/16/14 10:45 AM, Alexander Scherbatiy wrote: >>>>>>>> On 5/16/2014 7:15 PM, Pete Brunet wrote: >>>>>>>>> On 5/16/14 6:45 AM, Alexander Scherbatiy wrote: >>>>>>>>>> Hi Peter, >>>>>>>>>> >>>>>>>>>> Is there any difference between >>>>>>>>>> AccessibleAWTFocusHandler and >>>>>>>>>> AccessibleFocusHandler classes? >>>>>>>>> Hi Alexandr, The former is the focus handler used by the inner >>>>>>>>> class >>>>>>>>> accessibility support for an AWT Component and the latter is the >>>>>>>>> focus >>>>>>>>> handler used by the inner class accessibility support for a >>>>>>>>> JComponent. >>>>>>>>> >>>>>>>>> The code is the same. >>>>>>>> Is it possible to remove the AccessibleFocusHandler class >>>>>>>> at all >>>>>>>> and initialize the accessibleAWTFocusHandler >>>>>>>> only in the >>>>>>>> AccessibleAWTFocusHandler.addPropertyChangeListener() >>>>>>>> method? >>>>>>> This looks like it will work and I would like that solution a lot >>>>>>> better. I'll give it a try and if that works out I'll provide a >>>>>>> new >>>>>>> webrev. Thanks Alexandr. >>>>>> Hi Alexandr and AWT/Swing teams, >>>>>> >>>>>> Please review the new webrev at >>>>>> http://cr.openjdk.java.net/~ptbrunet/JDK-8009883/webrev.01/ >>>>> The fix looks good for me. >>>> Sorry. I just realize that the AccessibleFocusHandler class has >>>> protected access and can't be removed because of the compatibility >>>> reasons. >>>> http://docs.oracle.com/javase/7/docs/api/javax/swing/JComponent.AccessibleJComponent.AccessibleFocusHandler.html >>>> >>>> >>>> >>>> All others looks good for me. Just leave the >>>> AccessibleFocusHandler class from AccessibleJComponent as is. >>> Thanks very much for catching that Alexandr! The new webrev is here: >>> http://cr.openjdk.java.net/~ptbrunet/JDK-8009883/webrev.03/ >>> >>> Note that I added a @Deprecated tag (and javadoc tag). Hopefully >>> that's >>> the correct thing to do. >>> >>> I'd like to list one more reviewer on the patch so I'd appreciate one >>> more set of eyes on this. >>> >>> Pete >>>> Thanks, >>>> Alexandr. >>>> >>>>> Thanks, >>>>> Alexandr. >>>>> >>>>>> Pete >>>>>>>> Thanks, >>>>>>>> Alexandr. >>>>>>>> >>>>>>>>> The former code is this: >>>>>>>>> >>>>>>>>> protected class AccessibleAWTFocusHandler implements >>>>>>>>> FocusListener { >>>>>>>>> public void focusGained(FocusEvent event) { >>>>>>>>> if (accessibleContext != null) { >>>>>>>>> accessibleContext.firePropertyChange( >>>>>>>>> AccessibleContext.ACCESSIBLE_STATE_PROPERTY, >>>>>>>>> null, >>>>>>>>> AccessibleState.FOCUSED); >>>>>>>>> } >>>>>>>>> } >>>>>>>>> public void focusLost(FocusEvent event) { >>>>>>>>> if (accessibleContext != null) { >>>>>>>>> accessibleContext.firePropertyChange( >>>>>>>>> AccessibleContext.ACCESSIBLE_STATE_PROPERTY, >>>>>>>>> AccessibleState.FOCUSED, null); >>>>>>>>> } >>>>>>>>> } >>>>>>>>> } >>>>>>>>> >>>>>>>>> and the latter code is this >>>>>>>>> >>>>>>>>> protected class AccessibleFocusHandler implements >>>>>>>>> FocusListener { >>>>>>>>> public void focusGained(FocusEvent event) { >>>>>>>>> if (accessibleContext != null) { >>>>>>>>> accessibleContext.firePropertyChange( >>>>>>>>> AccessibleContext.ACCESSIBLE_STATE_PROPERTY, >>>>>>>>> null, AccessibleState.FOCUSED); >>>>>>>>> } >>>>>>>>> } >>>>>>>>> public void focusLost(FocusEvent event) { >>>>>>>>> if (accessibleContext != null) { >>>>>>>>> accessibleContext.firePropertyChange( >>>>>>>>> AccessibleContext.ACCESSIBLE_STATE_PROPERTY, >>>>>>>>> AccessibleState.FOCUSED, null); >>>>>>>>> } >>>>>>>>> } >>>>>>>>> } >>>>>>>>>> Thanks, >>>>>>>>>> Alexandr. >>>>>>>>>> >>>>>>>>>> On 5/7/2014 5:45 AM, Pete Brunet wrote: >>>>>>>>>>> Hi Swing and AWT teams, (and Artem since you were involved >>>>>>>>>>> in the >>>>>>>>>>> 7179482 fix), >>>>>>>>>>> >>>>>>>>>>> I'd appreciate your review for a fix to a regression in >>>>>>>>>>> java.awt.Component and javax.swing.JComponent. >>>>>>>>>>> >>>>>>>>>>> Original bug: https://bugs.openjdk.java.net/browse/JDK-7179482 >>>>>>>>>>> Orignal CCC: 7179482 >>>>>>>>>>> Regression Bug: >>>>>>>>>>> https://bugs.openjdk.java.net/browse/JDK-8009883 >>>>>>>>>>> Regression Fix Webrev: >>>>>>>>>>> http://cr.openjdk.java.net/~ptbrunet/JDK-8009883/webrev.00/ >>>>>>>>>>> >>>>>>>>>>> Problem Description: >>>>>>>>>>> jdk/test/closed/javax/swing/AbstractButton/4246045/bug4246045.java >>>>>>>>>>> >>>>>>>>>>> tests >>>>>>>>>>> to make sure the focus state changes whenever a JButton or >>>>>>>>>>> JToggleButton >>>>>>>>>>> property change listener is called. The problem in this case >>>>>>>>>>> is that >>>>>>>>>>> for each change of focus the listener is called twice. The >>>>>>>>>>> first time >>>>>>>>>>> there is no problem because for example the component is not >>>>>>>>>>> focused and >>>>>>>>>>> then it is, but the second time the listener is called the >>>>>>>>>>> component is >>>>>>>>>>> already focused and the new state is also focused so the >>>>>>>>>>> test case >>>>>>>>>>> detects that the focus state didn't change. >>>>>>>>>>> >>>>>>>>>>> Root cause: >>>>>>>>>>> There are two focus gained and two focus lost events fired when >>>>>>>>>>> JComponents gain/loose focus. Part of the fix for JDK-7179482 >>>>>>>>>>> was to >>>>>>>>>>> deprecate the >>>>>>>>>>> JComponent.AccessibleJComponent.accessibleFocusHandler >>>>>>>>>>> field noting that >>>>>>>>>>> Component.AccessibleAWTComponent.accessibleAWTFocusHandler >>>>>>>>>>> should be >>>>>>>>>>> used instead. The problem is that this was not done when >>>>>>>>>>> 7179482 was >>>>>>>>>>> fixed. The end result is that two focus listeners are added >>>>>>>>>>> when >>>>>>>>>>> JComponent.AccessibleJComponent.addPropertyChangeListener is >>>>>>>>>>> called. >>>>>>>>>>> The first listener is added in that property change method >>>>>>>>>>> and the >>>>>>>>>>> second one is added when the superclass method is called, i.e. >>>>>>>>>>> Component.AccessibleAWTComponent.addPropertyChangeListener. The >>>>>>>>>>> two >>>>>>>>>>> listeners cause two focus events with the second one not >>>>>>>>>>> causing a >>>>>>>>>>> state >>>>>>>>>>> change. >>>>>>>>>>> >>>>>>>>>>> Proposed fix: >>>>>>>>>>> The proposed fix is for >>>>>>>>>>> JComponent.AccessibleJComponent.addPropertyChangeListener to >>>>>>>>>>> set its >>>>>>>>>>> listener into >>>>>>>>>>> Component.AccessibleAWTComponent.accessibleAWTFocusHandler >>>>>>>>>>> so when the superclass method, >>>>>>>>>>> Component.AccessibleAWTComponent.addPropertyChangeListener is >>>>>>>>>>> called the >>>>>>>>>>> listener at that level will already be set. >>>>>>>>>>> >>>>>>>>>>> A side effect of the fix is that logic was needed to be >>>>>>>>>>> added in >>>>>>>>>>> Component.AccessibleAWTComponent.addPropertyChangeListener >>>>>>>>>>> to deal >>>>>>>>>>> with >>>>>>>>>>> the fact that the >>>>>>>>>>> Component.AccessibleAWTComponent.accessibleAWTFocusHandler >>>>>>>>>>> field >>>>>>>>>>> can be >>>>>>>>>>> set either from within the object's subclass method >>>>>>>>>>> JComponent.AccessibleJComponent.addPropertyChangeListener or >>>>>>>>>>> via an >>>>>>>>>>> external call to >>>>>>>>>>> Component.AccessAWTComponent.addPropertyChangeListener >>>>>>>>>>> for cases other than when there is a JComponent subclass of >>>>>>>>>>> Component. >>>>>>>>>>> In the former case the listener is already set by the subclass >>>>>>>>>>> so a >>>>>>>>>>> focus listener isn't added. In the latter case the listener is >>>>>>>>>>> not >>>>>>>>>>> yet >>>>>>>>>>> added so a focus listener is new'd and added. >>>>>>>>>>> >>>>>>>>>>> There are similar considerations when removing a listener; this >>>>>>>>>>> can be >>>>>>>>>>> seen in the webrev. >>>>>>>>>>> >>>>>>>>>>> There may be a better way to fix this but the proposed fix does >>>>>>>>>>> resolve >>>>>>>>>>> the issue that the test case exposed. >>>>>>>>>>> >>>>>>>>>>> Best regards, >>>>>>>>>>> Pete >