You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JMenuBar设置RIGHT_TO_LEFT布局后方向键操作反向问题咨询

JMenuBar 右到左布局下方向键遍历异常问题

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 06:57:00