<Swing Dev> [Accessibility]Focus unable to traverse in the menubar

pavel porvatov pavel.porvatov at oracle.com
Mon Oct 8 11:47:26 UTC 2012


Hi Jonathan,
> Hi Pavel,
>
> On 10/02/2012 11:31 PM, Pavel Porvatov wrote:
>> Hi Jonathan,
>>> Hi Pavel,
>>>
>>> I've filed bug 7198816 for this problem,
>>>
>>> Regards, Pavel
>>> http://bugs.sun.com/view_bug.do?bug_id=7198816
>> This bug was not ported to jira, so I created another bug:
>> https://jbs.oracle.com/bugs/browse/JDK-8000326
>
> Thanks for porting, but I have trouble with opening that link.
Sorry, use the following link:
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=8000326

but the bug is not available yet... It contains the same description as 
the original bug.

> Any comments on the patch?
The fix looks dangerous for me. After the fix the 
setFocusTraversalKeysEnabled method doesn't work for JMenuBar (when 
ContainerOrderFocusTraversalPolicy is used) - it ignores this property...

Regards, Pavel
>
> best regards
> Jonathan
>
>>
>> Regards, Pavel
>>>
>>> On 11/09/2011 07:25 PM, Pavel Porvatov wrote:
>>>> Hi Jing,
>>>>> Thanks Pavel,
>>>>>
>>>>>      It seems fine to me, if no other suggestions/opinions, I 
>>>>> guess we can move on with this?
>>>> Yes, we can. Could you please file a bug for the problem as well?
>>>>
>>>> Thanks, Pavel
>>>>>
>>>>> On 2011/11/2 19:58, Pavel Porvatov wrote:
>>>>>> Hi Jing,
>>>>>>>
>>>>>>> Hello Anton,
>>>>>>>
>>>>>>>     Thanks for the review. I am still trying to figure out some 
>>>>>>> real case and provide more detail the customer may fail.
>>>>>>>     Anyway, I agree we'd better update the java spec to make it 
>>>>>>> clear for the customers. I'd like to know if anyone can help 
>>>>>>> with that?
>>>>>> I'm not sure that javadoc changing is a good decision in this 
>>>>>> case. ContainerOrderFocusTraversalPolicy is designed for AWT, but 
>>>>>> I don't know why that policy cannot be used for Swing components 
>>>>>> as well. I see several problems:
>>>>>> 1. We cannot change javadoc of ContainerOrderFocusTraversalPolicy 
>>>>>> because of backward compatibility
>>>>>> 2. We cannot remove setFocusTraversalKeysEnabled(false) from the 
>>>>>> JMenuBar#JMenuBar() constructor because of backward compatibility
>>>>>>
>>>>>> May be the best decision is to specify, that JMenuBar creates 
>>>>>> menu with the focusTraversalKeysEnabled = false
>>>
>>> Did you mean that for the new menu 
>>> setFocusTraversalKeysEnabled(false) ? I've tried, but it does not 
>>> seem to work for this problem.
>>>
>>>  if my understanding is incorrect, please help to fix me.
>>>
>>>>>>
>>>>>> Regards, Pavel
>>>>>>>
>>>>>>> On 2011/10/12 20:54, Anton Tarasov wrote:
>>>>>>>> Hi Neil,
>>>>>>>>
>>>>>>>> On 10/10/2011 7:01 PM, Neil Richards wrote:
>>>>>>>>> On Mon, 2011-10-10 at 16:56 +0400, Anton Tarasov wrote:
>>>>>>>>>> Hi Neil and Jing,
>>>>>>>>>> I'm afraid that it's wrong to use 
>>>>>>>>>> ContainerOrderFocusTraversalPolicy
>>>>>>>>>> for swing components. This policy is designed for AWT.
>>>>>>>>>> JMenuBar calls setFocusTraversalKeysEnabled(false) in its 
>>>>>>>>>> ctor which
>>>>>>>>>> means that it "swallows" focus traversal keys (like 
>>>>>>>>>> TAB/SHIFT-TAB
>>>>>>>>>> etc.)
>>>>>>>>>> and so it can't be a member of a focus traversal chain. Swing's
>>>>>>>>>> default traversal policy (LayoutFocusTraversalPolicy) excludes
>>>>>>>>>> JMenuBar
>>>>>>>>>> from a focus traversal cycle. 
>>>>>>>>>> ContainerOrderFocusTraversalPolicy is
>>>>>>>>>> not "aware" about JMenuBar and so it allows it.
>>>>>>>>>>
>>>>>>>>>> So, either a default Swing policy should be used, or a custom 
>>>>>>>>>> policy.
>>>>>>>>>> At worst, ContainerOrderFocusTraversalPolicy should be overriden
>>>>>>>>>> to exclude JMenuBar from a cycle (override its accept(Component)
>>>>>>>>>> method).
>>>
>>> I agree that backward compatibility should not be broken by the fix, 
>>> so here's a patch from me for the worst case, could you please help 
>>> to take a look?
>>>
>>> http://cr.openjdk.java.net/~luchsh/7198816/
>>>
>>> Thanks
>>> Jonathan
>>>
>>>>>>>>>>
>>>>>>>>>> Thanks,
>>>>>>>>>> Anton.
>>>>>>>>> Hi Anton,
>>>>>>>>> Thanks for reviewing the suggestion, and for your insights 
>>>>>>>>> into this
>>>>>>>>> scenario.
>>>>>>>>>
>>>>>>>>> > From the Javadoc, it seems that 
>>>>>>>>> setFocusTraversalKeysEnabled() is mainly
>>>>>>>>> concerned with choosing whether focus traversal key presses 
>>>>>>>>> (normally
>>>>>>>>> TAB and SHIFT-TAB) are processed "automatically" (when 'true') 
>>>>>>>>> or are
>>>>>>>>> delivered to the Component as key events (for the component's 
>>>>>>>>> code to
>>>>>>>>> process "manually").
>>>>>>>>>
>>>>>>>>> (In the case of JMenuBar, it makes them come through as key 
>>>>>>>>> events, but
>>>>>>>>> doesn't do anything special to process these events, which is 
>>>>>>>>> why they
>>>>>>>>> get discarded.)
>>>>>>>>
>>>>>>>> That is right, though it doesn't directly relate to the issue 
>>>>>>>> we're talking about =)
>>>>>>>>
>>>>>>>>> Your description above, though, seems to suggest that it is 
>>>>>>>>> generally
>>>>>>>>> undesirable for the JMenuBar to be given the focus, as all the
>>>>>>>>> Swing-aware focus traversal policies make a point of not 
>>>>>>>>> giving focus to
>>>>>>>>> JMenuBar items.
>>>>>>>>>
>>>>>>>>> If this is so, then wouldn't it make sense to call 
>>>>>>>>> setFocusable(false)
>>>>>>>>> from its constructor (too), to ensure it doesn't get focus ?
>>>>>>>>>
>>>>>>>>> Or, to put it another way, could you explain a little of the 
>>>>>>>>> reasoning
>>>>>>>>> or scenario behind why it is desirable for JMenuBar items to be
>>>>>>>>> generally focusable, even though they aren't focus-traversable ?
>>>>>>>>>
>>>>>>>>> I think such an explanation would be really helpful in 
>>>>>>>>> clearing up my
>>>>>>>>> confusion on this point.
>>>>>>>>>
>>>>>>>>> Thanks, Neil
>>>>>>>>>
>>>>>>>>
>>>>>>>> Well, I suspect that the core of the problem is that adding 
>>>>>>>> JMenuBar as JComponent to a swing
>>>>>>>> container doesn't make much sense. Though it is not directly 
>>>>>>>> prohibited, doing so may cause
>>>>>>>> side effects like the one you've discovered. When JMenuBar is 
>>>>>>>> set properly onto a JFrame its focus
>>>>>>>> is managed by JRootPane and its focusability just isn't taken 
>>>>>>>> into account. That's may be the reason
>>>>>>>> it's not declared unfocusable. Honestly, I can't tell you exactly.
>>>>>>>>
>>>>>>>> If you do it, you probably won't make any harm, but I 
>>>>>>>> personally don't think this is a vital fix
>>>>>>>> (unless you have a good use case of the scenario you've 
>>>>>>>> provided). Anyway, this is a swing question
>>>>>>>> (I'm, as an AWT dev member, leaving the decision to swing guys).
>>>>>>>>
>>>>>>>> Thanks,
>>>>>>>> Anton.
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>
>>>>>>
>>>>>
>>>>
>>>
>>
>



More information about the swing-dev mailing list