JMenuBar设置RIGHT_TO_LEFT布局后方向键操作反向问题咨询
在Windows 10系统下使用Java 11.0.12版本进行Swing开发时,为JMenuBar调用setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT)方法设置右到左布局后,出现键盘方向键遍历菜单栏行为与预期不符的问题:按下右方向键时选中的菜单会向左切换,按下左方向键时则会向右切换。
问题复现代码
import java.awt.BorderLayout; import java.awt.ComponentOrientation; import java.awt.Dimension; import java.awt.Toolkit; import javax.swing.JFrame; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; @SuppressWarnings("serial") public class MenuBarProblem extends JFrame { private JMenuBar menuBar; private JMenu firstMenu; private JMenuItem a; private JMenuItem b; private JMenu secondMenu; private JMenuItem c; private JMenuItem d; private JMenu thirdMenu; private JMenuItem e; private JMenuItem f; public MenuBarProblem() { this.setLayout(new BorderLayout()); Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); this.setExtendedState(JFrame.MAXIMIZED_BOTH); this.setSize(screenSize); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.firstMenu = new JMenu("first"); this.a = new JMenuItem("a"); this.b = new JMenuItem("b"); this.firstMenu.add(this.a); this.firstMenu.add(this.b); this.secondMenu = new JMenu("second"); this.c = new JMenuItem("c"); this.d = new JMenuItem("d"); this.secondMenu.add(this.c); this.secondMenu.add(this.d); this.thirdMenu = new JMenu("third"); this.e = new JMenuItem("e"); this.f = new JMenuItem("f"); this.thirdMenu.add(this.e); this.thirdMenu.add(this.f); this.menuBar = new JMenuBar(); this.menuBar.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT); // 触发问题的代码 this.menuBar.add(this.firstMenu); this.menuBar.add(this.secondMenu); this.menuBar.add(this.thirdMenu); this.setJMenuBar(this.menuBar); } }
入口主类代码(含main方法)
import java.lang.reflect.InvocationTargetException; import javax.swing.SwingUtilities; import javax.swing.UIManager; import javax.swing.UnsupportedLookAndFeelException; public class Main { public static void main(String[] args) { try { SwingUtilities.invokeAndWait(new Runnable() { public void run() { try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException e) { e.printStackTrace(); } } }); } catch (InvocationTargetException | InterruptedException e) { e.printStackTrace(); } SwingUtilities.invokeLater(new Runnable() { @Override public void run() { MenuBarProblem test = new MenuBarProblem(); test.setVisible(true); } }); } }
官方确认说明
该问题已被判定为Java官方Bug,已收录至官方Bug数据库,对应Bug编号为8277369。
内容的提问来源于stack exchange,提问作者Bu Saeed
相关产品推荐
相关产品推荐

