<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