JavaSwing:如何在行和列中对齐菜单项?

JavaSwing:如何在行和列中对齐菜单项?,java,swing,menu,items,Java,Swing,Menu,Items,很抱歉,在创建菜单栏及其项时没有问题。但是现在,当我遇到一个问题,如何使菜单项以列&行的形式出现,像桌子一样,我真的不知道 目标是使用java创建此类菜单项。 现在,我只是想我应该使用一个jpanel作为菜单项,然后应用一个flowlayout,然后在网格中添加许多jlabel作为菜单项。但这不是最糟糕的吗? 在上面的链接上创建菜单项(如图像预览)的最佳方案是什么 我试过谷歌,但没有发现相关案例。CMIIW.我还没有看到这样的现成组件。所以我认为你是一个人 我认为有两种可能性: JMenuIt

很抱歉,在创建菜单栏及其项时没有问题。但是现在,当我遇到一个问题,如何使菜单项以列&行的形式出现,像桌子一样,我真的不知道

目标是使用java创建此类菜单项。

现在,我只是想我应该使用一个jpanel作为菜单项,然后应用一个flowlayout,然后在网格中添加许多jlabel作为菜单项。但这不是最糟糕的吗? 在上面的链接上创建菜单项(如图像预览)的最佳方案是什么


我试过谷歌,但没有发现相关案例。CMIIW.

我还没有看到这样的现成组件。所以我认为你是一个人

我认为有两种可能性:

  • JMenuItem是一个JComponent,因此您可以向它添加其他组件。您可能希望使用某种基于网格的布局,并为数字添加按钮或标签

  • 实现您自己的JMenuItem,它显示您的网格组件,而不是普通的JPopMenu


  • 在任何情况下,都可以查看JMenu(Item)的源代码,以了解这些组件是如何工作的。

    JMenu实例的弹出菜单是一个标准容器,因此您可以向其中添加任何需要的内容。它有一个默认布局,但您可以更改它

    类似于您的模型中的内容是由以下代码创建的:

    import javax.swing.*;
    import java.awt.*;
    
    public class Test {
        public static void main(String[] args) {
            EventQueue.invokeLater(new Runnable() {
                @Override
                public void run() {
                    JFrame frame = new JFrame("Menu test");
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    frame.setSize(new Dimension(600, 400));
                    JMenuBar menuBar = new JMenuBar();
                    JMenu menu = new JMenu("Test");
                    JPopupMenu popupMenu = menu.getPopupMenu();
                    popupMenu.setLayout(new GridLayout(5, 5));
                    for (int r = 0; r < 5; r++) {
                        for (int c = 0; c < 5; c++) {
                            popupMenu.add(new JMenuItem("(" + (r + 1) + ", " + (c + 1) + ")"));
                        }
                    }
    
                    menuBar.add(menu);
                    frame.setJMenuBar(menuBar);
    
                    frame.setVisible(true);
                }
            });
        }
    
    }
    
    import javax.swing.*;
    导入java.awt.*;
    公开课考试{
    公共静态void main(字符串[]args){
    invokeLater(新的Runnable(){
    @凌驾
    公开募捐{
    JFrame=新JFrame(“菜单测试”);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    框架设置尺寸(新尺寸(600400));
    JMenuBar menuBar=新的JMenuBar();
    JMenu菜单=新JMenu(“测试”);
    jpoppupmenu popupMenu=menu.getPopupMenu();
    setLayout(新的GridLayout(5,5));
    对于(int r=0;r<5;r++){
    对于(int c=0;c<5;c++){
    添加(新的JMenuItem(“(”+(r+1)+“,“+(c+1)+”);
    }
    }
    菜单栏。添加(菜单);
    frame.setJMenuBar(菜单栏);
    frame.setVisible(true);
    }
    });
    }
    }
    
    最简单的解决方案就是设置JMenu的jpopmpmenu的布局,然后像平常一样添加项目。不需要创建子类

    例如:

    import javax.swing.*;
    import java.awt.*;
    
    public class menu {
        public static void main(String ... args) {
            SwingUtilities.invokeLater(new Runnable() {
                    public void run() {
                        JMenuBar menuBar = new JMenuBar();
    
                        JMenu menu = new JMenu("A regular menu");
                        menu.add(new JMenuItem("Menu item"));
    
                        JMenu gridMenu = new JMenu("Menu with grid");
                        // This does the trick:
                        gridMenu.getPopupMenu().setLayout(new GridLayout(2, 2));
                        gridMenu.add("Top left");
                        gridMenu.add("Top right");
                        gridMenu.add("Bottom left");
                        gridMenu.add("Bottom right");
                        menu.add(gridMenu);
    
                        menuBar.add(menu);
    
                        JFrame frame = new JFrame("Menus");
                        frame.setJMenuBar(menuBar);
                        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                        frame.pack();
                        frame.setVisible(true);
                    }
                });
        }
    }
    

    呸。。。!谢谢@Daan。它帮助了我,虽然它只是一个字符串而不是一个菜单项:D