<Swing Dev> [Accessibility]Focus unable to traverse in the menubar
Pavel Porvatov
pavel.porvatov at oracle.com
Mon Sep 19 09:52:07 UTC 2011
Hi Jing,
I can't agree with you about the problem. According to
http://download.oracle.com/javase/tutorial/uiswing/components/menu.html
"Menus are unique in that, by convention, they aren't placed with the
other components in the UI". Instead, a menu usually appears either in a
menu bar or as a popup menu", so your test-case is invalid.
Regards, Pavel
> Hello,
>
> I've found an accessibility issue. Here is the simple testcase:
>
> public static void main() {
> JFrame jf=new JFrame("Hello");
> JMenuBar menubar = new JMenuBar();
> menubar.add(new JMenu("sample menu").add(new
> JMenuItem("hello")));
> jf.setSize(300,300);
> String[] comboEditableArray = { "Editable JCombobox 1",
> "Editable JCombobox 2", "Editable JCombobox 3", "Editable JCombobox
> 4", "Editable JCombobox 5" };
> JComboBox jc=new JComboBox(comboEditableArray);
> jc.setEditable(true);
> JButton jb1=new JButton("ok");
> JButton jb2=new JButton("ok");
> JTree jTree;
> jTree = new JTree();
> jTree.setName("JTree");
> jTree.setFocusable(true);
> jTree.setSelectionInterval(0, 0);
>
> JPanel jp=new JPanel();
> jp.add(jb1);
>
> jp.add(jc);
> jp.add(jTree);
> jp.add(menubar);
> jp.add(jb2);
>
> jf.getContentPane().add(jp);
> jf.show();
>
> KeyboardFocusManager kFocusMan =
> KeyboardFocusManager.getCurrentKeyboardFocusManager();
> kFocusMan.setDefaultFocusTraversalPolicy(new
> ContainerOrderFocusTraversalPolicy());
>
> jf.setFocusTraversalPolicy(KeyboardFocusManager
> .getCurrentKeyboardFocusManager()
> .getDefaultFocusTraversalPolicy());
>
> }
> public static void main(String[] args) {
>
> //Schedule a job for the event-dispatching thread:
> //creating and showing this application's GUI
> javax.swing.SwingUtilities.invokeLater(
> new Runnable() {
> public void run() { JEditableComboFocusTest.main(); }
> }
> );
> }
>
> Running this testcase on JDK6/7 will find if we set focus on
> "JTree" item and then press TAB key, the focus lost (which we except
> it should focus on the last "OK" button).
> It seems the problem is that, the focus stays in the menubar and
> does not move to the other component. The reason is the focus
> traversal keys are disabled in the JMenuBar. But since the JMenuBar is
> focusable, the focus is moving to JMenuBar and since the focus
> traversal keys are disabled, the focus is staying back there and not
> coming to other components. When the focus traversal keys are disabled.
>
> A simple fix would be that disable focus for JMenuBar. The patch
> may be:
> diff --git a/src/share/classes/javax/swing/JMenuBar.java
> b/src/share/classes/javax/swing/JMenuBar.java
> index 4f77268..e5db3f8 100644
> --- a/src/share/classes/javax/swing/JMenuBar.java
> +++ b/src/share/classes/javax/swing/JMenuBar.java
> @@ -109,6 +109,8 @@ public class JMenuBar extends JComponent
> implements Accessible,MenuElement
> public JMenuBar() {
> super();
> setFocusTraversalKeysEnabled(false);
> + /* Changing focus to false by default as Menu bar should not
> get focus. */
> + setFocusable(false);
> setSelectionModel(new DefaultSingleSelectionModel());
> updateUI();
> }
>
> Any comments? Thanks.
More information about the swing-dev
mailing list