JavaSwingJMenu不断消失

JavaSwingJMenu不断消失,java,swing,jdialog,jmenu,jmenuitem,Java,Swing,Jdialog,Jmenu,Jmenuitem,好吧,相信我,当我告诉你我已经对这件事做了尽职调查。 我已经试着调试了很长一段时间了,我已经一次又一次地检查了代码。我已经检查了堆栈溢出,没有人遇到过这个问题 所以我尝试在JavaSwing中创建一个菜单。此菜单位于JPanel上。我知道按照惯例,它应该在JFrame上,但在JPanel上对我的情况最好。问题是,当我点击“功能”菜单,并尝试将鼠标悬停在其中一个菜单项上时,菜单会自动消失。我试图在JFrame上实现相同的代码,但同样的事情发生了 不用多说,下面是代码: public static

好吧,相信我,当我告诉你我已经对这件事做了尽职调查。 我已经试着调试了很长一段时间了,我已经一次又一次地检查了代码。我已经检查了堆栈溢出,没有人遇到过这个问题

所以我尝试在JavaSwing中创建一个菜单。此菜单位于
JPanel
上。我知道按照惯例,它应该在
JFrame
上,但在JPanel上对我的情况最好。问题是,当我点击“功能”菜单,并尝试将鼠标悬停在其中一个菜单项上时,菜单会自动消失。我试图在
JFrame
上实现相同的代码,但同样的事情发生了

不用多说,下面是代码:

public static String[] getRGBInputsFromDialogBox(String title) {
    JTextField rField = new JTextField(5);
    JTextField gField = new JTextField(5);
    JTextField bField=new JTextField(5);

    JPanel myPanel = new JPanel(new FlowLayout());
    myPanel.add(new JLabel("R(x,y): "));
    myPanel.add(rField);
    myPanel.add(Box.createHorizontalStrut(15)); // a spacer
    myPanel.add(new JLabel("G(x,y): "));
    myPanel.add(gField);
    myPanel.add(Box.createHorizontalStrut(15));//spacer
    myPanel.add(new JLabel("B(x,y): "));
    myPanel.add(bField);



    String[] myClasses=ClassInfo.getClasses();                                
    //  { { { { } , { } } , { { } , { } } } , { { { } , { } } , { { } , { } } } }

    //Creating Menu Bar
    JMenuBar menuBar=new JMenuBar();
        JMenu functionsMenu=new JMenu("Functions");
            JMenuItem[] classes=new JMenuItem[myClasses.length];
            for(int i=0;i<ClassInfo.classes.length;i++) {
                String[][] classMethods=ClassInfo.showMethodsForClass(ClassInfo.classes[i]);//  { {static} , {instance} }
                final String className=ClassInfo.classes[i].getSimpleName();
                JMenuItem[] staticMethodsItem=new JMenuItem[classMethods[0].length];
                JMenuItem[] instanceMethodsItem=new JMenuItem[classMethods[1].length];
                JMenuItem staticMenuItem=new JMenuItem("Static methods");
                JMenuItem instanceMenuItem=new JMenuItem("Instance methods");
                JMenu staticMenu=new JMenu();
                staticMenuItem.add(staticMenu);
                JMenu instanceMenu=new JMenu();
                instanceMenuItem.add(instanceMenu);

                for(int a=0;a<classMethods[0].length;a++)   {
                    final String methodName=classMethods[0][a];
                    staticMethodsItem[a]=new JMenuItem(methodName);
                    staticMethodsItem[a].addActionListener(new ActionListener() {
                        public void actionPerformed(ActionEvent e)  {
                            ClassInfo.copyToClipBoard(ClassInfo.staticWriteableString(methodName,className));
                        }
                    });
                    staticMenu.add(staticMethodsItem[a]);
                }

                for(int a=0;a<classMethods[1].length;a++)   {
                    final String methodName=classMethods[1][a];
                    instanceMethodsItem[a]=new JMenuItem(methodName);
                    instanceMethodsItem[a].addActionListener(new ActionListener()   {
                        public void actionPerformed(ActionEvent e)  {
                            ClassInfo.copyToClipBoard(ClassInfo.instanceWriteableString(methodName));
                        }
                    });
                    instanceMenu.add(instanceMethodsItem[a]);
                }

                classes[i]=new JMenuItem(className);
                JMenu methodTypeMenu=new JMenu();
                methodTypeMenu.add(staticMenuItem); //add static method submenu to the new class submenu
                methodTypeMenu.add(instanceMenuItem);//add instance method submenu to the new class submenu
                classes[i].add(methodTypeMenu); //Make the new class a submenu
                functionsMenu.add(classes[i]); //Add a new class in the functions menu
            }
    menuBar.add(functionsMenu);
    myPanel.add(menuBar);

    int result = JOptionPane.showConfirmDialog(null, myPanel, title, JOptionPane.OK_CANCEL_OPTION);
    if (result == JOptionPane.OK_OPTION) {
        String[] arr= {rField.getText(),gField.getText(),bField.getText()};
        return arr;
    }
    return null;
}
公共静态字符串[]getRGBInputsFromDialogBox(字符串标题){
JTextField rField=新的JTextField(5);
JTextField gField=新的JTextField(5);
JTextField bField=新的JTextField(5);
JPanel myPanel=newjpanel(newflowlayout());
添加(新的JLabel(“R(x,y):”);
myPanel.add(rField);
myPanel.add(Box.createHorizontalStruct(15));//一个垫片
添加(新的JLabel(“G(x,y):”));
myPanel.add(gField);
myPanel.add(Box.createHorizontalStruct(15));//垫片
添加(新的JLabel(“B(x,y):”);
myPanel.add(bField);
字符串[]myClasses=ClassInfo.getClasses();
//  { { { { } , { } } , { { } , { } } } , { { { } , { } } , { { } , { } } } }
//创建菜单栏
JMenuBar menuBar=新的JMenuBar();
JMenu Functions菜单=新JMenu(“函数”);
JMenuItem[]classes=新的JMenuItem[myClasses.length];

对于(int i=0;i我想我理解了这个问题。您正在混合使用JMenu和JMenuItem。这是结构:

JMenuBar有一个JMenu/JMenuItem有一个JMenu/JMenuItem

将内部for循环更改为此,它应该可以工作:

JMenuBar menuBar=new JMenuBar();
JMenu functionsMenu=new JMenu("Functions");
JMenuItem[] classes=new JMenuItem[myClasses.length];
for(int i=0;i<ClassInfo.classes.length;i++) {
    String[][] classMethods=ClassInfo.showMethodsForClass(ClassInfo.classes[i]);//  { {static} , {instance} }
    final String className=ClassInfo.classes[i].getSimpleName();
    JMenuItem[] staticMethodsItem=new JMenuItem[classMethods[0].length];
    JMenuItem[] instanceMethodsItem=new JMenuItem[classMethods[1].length];
    JMenu staticMenu=new JMenu("Static Methods");
    JMenu instanceMenu=new JMenu("Instance Methods");

    for(int a=0;a<classMethods[0].length;a++)   {
        final String methodName=classMethods[0][a];
        staticMethodsItem[a]=new JMenuItem(methodName);
        staticMethodsItem[a].addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e)  {
                ClassInfo.copyToClipBoard(ClassInfo.staticWriteableString(methodName,className));
            }
        });
        staticMenu.add(staticMethodsItem[a]);
    }

    for(int a=0;a<classMethods[1].length;a++)   {
        final String methodName=classMethods[1][a];
        instanceMethodsItem[a]=new JMenuItem(methodName);
        instanceMethodsItem[a].addActionListener(new ActionListener()   {
            public void actionPerformed(ActionEvent e)  {
                ClassInfo.copyToClipBoard(ClassInfo.instanceWriteableString(methodName));
            }
        });
        instanceMenu.add(instanceMethodsItem[a]);
    }

    classes[i]=new JMenu(className);
    classes[i].add(staticMenu); //add static method submenu to the new class submenu
    classes[i].add(instanceMenu);//add instance method submenu to the new class submenu
    functionsMenu.add(classes[i]); //Add a new class in the functions menu
}
menuBar.add(functionsMenu);
JMenuBar menuBar=newjmenubar();
JMenu Functions菜单=新JMenu(“函数”);
JMenuItem[]classes=新的JMenuItem[myClasses.length];

对于(int i=0;iYou与SSCCE非常接近。如果您粘贴ClassInfo类的内容,我可以看一看并返回。@sethu确定没问题,在这里!提前感谢Wesome!谢谢,效果很好!我想问题是,在两个内部for循环之后,我试图为每个类添加一个JMenuItem,然后添加另一个菜单对象ct到每个JMenuItems。我应该为每个类添加一个菜单项到function菜单。开始有点混乱,但我想我现在明白了,多亏了你!
JMenuBar menuBar=new JMenuBar();
JMenu functionsMenu=new JMenu("Functions");
JMenuItem[] classes=new JMenuItem[myClasses.length];
for(int i=0;i<ClassInfo.classes.length;i++) {
    String[][] classMethods=ClassInfo.showMethodsForClass(ClassInfo.classes[i]);//  { {static} , {instance} }
    final String className=ClassInfo.classes[i].getSimpleName();
    JMenuItem[] staticMethodsItem=new JMenuItem[classMethods[0].length];
    JMenuItem[] instanceMethodsItem=new JMenuItem[classMethods[1].length];
    JMenu staticMenu=new JMenu("Static Methods");
    JMenu instanceMenu=new JMenu("Instance Methods");

    for(int a=0;a<classMethods[0].length;a++)   {
        final String methodName=classMethods[0][a];
        staticMethodsItem[a]=new JMenuItem(methodName);
        staticMethodsItem[a].addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e)  {
                ClassInfo.copyToClipBoard(ClassInfo.staticWriteableString(methodName,className));
            }
        });
        staticMenu.add(staticMethodsItem[a]);
    }

    for(int a=0;a<classMethods[1].length;a++)   {
        final String methodName=classMethods[1][a];
        instanceMethodsItem[a]=new JMenuItem(methodName);
        instanceMethodsItem[a].addActionListener(new ActionListener()   {
            public void actionPerformed(ActionEvent e)  {
                ClassInfo.copyToClipBoard(ClassInfo.instanceWriteableString(methodName));
            }
        });
        instanceMenu.add(instanceMethodsItem[a]);
    }

    classes[i]=new JMenu(className);
    classes[i].add(staticMenu); //add static method submenu to the new class submenu
    classes[i].add(instanceMenu);//add instance method submenu to the new class submenu
    functionsMenu.add(classes[i]); //Add a new class in the functions menu
}
menuBar.add(functionsMenu);