SWING JMenuBar JMenu 元素被压缩而不是断行。如何修复此行为

SWING JMenuBar JMenu elements get compressed instead of breaking line. How to fix this behaviour

我正在尝试让 Java Swing JMenuBar 元素正常工作。我的应用程序有几个菜单元素。问题是当用户将 window 的大小调整为小于菜单元素的大小时。发生的事情是菜单元素被压缩并最终相互重叠而不是使用更多行。 JMenuBar JMenu 元素不足 space 时有什么方法可以换行?

示例代码:

        frame = new JFrame();
        frame.setBounds(100, 100, 722, 300);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JMenuBar menuBar = new JMenuBar();
        frame.getContentPane().add(menuBar, BorderLayout.NORTH);

        JMenu mnNewMenu = new JMenu("New menu");
        menuBar.add(mnNewMenu);

        JMenu mnNewMenu_1 = new JMenu("New menu");
        menuBar.add(mnNewMenu_1);

        JMenu menu = new JMenu("New menu");
        menuBar.add(menu);

        JMenu menu_1 = new JMenu("New menu");
        menuBar.add(menu_1);

        JMenu menu_2 = new JMenu("New menu");
        menuBar.add(menu_2);

        JMenu menu_3 = new JMenu("New menu");
        menuBar.add(menu_3);

        JPanel split = new JPanel();
        frame.getContentPane().add(split, BorderLayout.CENTER);
        split.setLayout(new BorderLayout(0, 0));

        JPanel panel = new JPanel();

        JButton btnNewButton = new JButton("New button");

        JButton btnNewButton_1 = new JButton("New button");

        JButton btnNewButton_2 = new JButton("New button");
        split.add(panel, BorderLayout.CENTER);

        JLabel lblTextContentBla = new JLabel("Text content bla bla bla");
        panel.setLayout(new FlowLayout(FlowLayout.LEFT, 5, 5));
        panel.add(btnNewButton);
        panel.add(btnNewButton_1);
        panel.add(btnNewButton_2);
        panel.add(lblTextContentBla);

截图:

(P.D: Whosebug 坏了吗?当我 post 图片时,它说它找到了未格式化的代码。必须 post 链接作为代码,没有预览才能使其工作.. ??)

JMenuBar 的默认布局管理器是扩展 BoxLayoutDefaultMenuLayout。此布局不支持换行。

您可以尝试使用Wrap Layout看看是否符合您的要求。此布局扩展 FlowLayout 并允许组件换行。

基本代码为:

JMenuBar menubar = new JMenuBar();
menuBar.setLayout( new WrapLayout(WrapLayout.LEFT, 0, 0) );

您将获得环绕支持,但会失去其他 BoxLayout 功能。如果它不符合您的要求,那么您需要编写自己的自定义 LayoutManager.