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

Pavel Porvatov pavel.porvatov at oracle.com
Tue Oct 2 15:31:40 UTC 2012


Hi Jonathan,
> Hi Pavel,
>
> I've filed bug 7198816 for this problem,
>
> 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

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