Java 如何获取当前选定的菜单或菜单项

Java 如何获取当前选定的菜单或菜单项,java,swing,jmenu,jmenuitem,jmenubar,Java,Swing,Jmenu,Jmenuitem,Jmenubar,单击当前选定的菜单或菜单项时,如何检索该菜单或菜单项,随后的路径将打印在控制台上。在这段代码中,我完成了多达4个级别的菜单和子菜单。并希望在单击时打印所选菜单和子菜单的路径。我在这个程序中使用swing概念。请帮忙。提前谢谢 import java.awt.Component; import java.awt.event.KeyEvent; import javax.swing.JFrame; import javax.swing.JMenu; import javax.swing.JMenu

单击当前选定的菜单或菜单项时,如何检索该菜单或菜单项,随后的路径将打印在控制台上。在这段代码中,我完成了多达4个级别的菜单和子菜单。并希望在单击时打印所选菜单和子菜单的路径。我在这个程序中使用swing概念。请帮忙。提前谢谢

import java.awt.Component;
import java.awt.event.KeyEvent;

import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.MenuElement;
import javax.swing.MenuSelectionManager;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

public class Menu {

  public static void main(final String args[]) {
    JFrame frame = new JFrame("MenuSample Example");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JMenuBar menuBar = new JMenuBar();

JMenu worldMenu = new JMenu("world");
menuBar.add(worldMenu);


JMenu indMenu = new JMenu("India");
worldMenu.add(indMenu);
/* creates menu */
JMenu odMenu = new JMenu("Odisha");
indMenu.add(odMenu);

JMenu delhiMenu = new JMenu("Delhi");
indMenu.add(delhiMenu);

JMenu upMenu = new JMenu("Uttar Pradesh");
indMenu.add(upMenu);

JMenu mpMenu = new JMenu("Madhya Pradesh");
    indMenu.add(mpMenu);

    JMenu ausMenu = new JMenu("Australia");
worldMenu.add(ausMenu);

JMenu AmericaMenu = new JMenu("America");
worldMenu.add(AmericaMenu);

/* creates submenu */
JMenu bbMenu = new JMenu("Bhubaneswar");
odMenu.add(bbMenu);

JMenu bmMenu = new JMenu("Berhampur");
odMenu.add(bmMenu);
/*creates sub sub menu */
JMenuItem rjMenuItem = new JMenuItem("Raj Mahal");
bbMenu.add(rjMenuItem);

JMenuItem abMenuItem = new JMenuItem("Acharya Bihar");
bbMenu.add(abMenuItem);

JMenuItem bnMenuItem = new JMenuItem("Bani Bihar");
bbMenu.add(bnMenuItem);
/* retrieving path */

MenuSelectionManager.defaultManager().addChangeListener(
        new ChangeListener() {
          public void stateChanged(ChangeEvent evt) {

            MenuElement[] path = MenuSelectionManager.defaultManager()
                .getSelectedPath();

            //
            int s=0;

            for (int i = 0; i < path.length; i++) {
                Component c = path[i].getComponent();
                if (c instanceof JMenuItem) {
                JMenuItem mi = (JMenuItem) c;
                String label = mi.getText();
                System.out.println("LEVEL----" + s);
                System.out.println("you hv selected:"+label);
                s++;


              }
            }

          }
        });

    //

    frame.setJMenuBar(menuBar);
    frame.setSize(350, 250);
    frame.setVisible(true);
  }
}
导入java.awt.Component;
导入java.awt.event.KeyEvent;
导入javax.swing.JFrame;
导入javax.swing.JMenu;
导入javax.swing.JMenuBar;
导入javax.swing.JMenuItem;
导入javax.swing.MenuElement;
导入javax.swing.MenuSelectionManager;
导入javax.swing.event.ChangeEvent;
导入javax.swing.event.ChangeListener;
公共类菜单{
公共静态void main(最终字符串参数[]){
JFrame=newjframe(“MenuSample示例”);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JMenuBar menuBar=新的JMenuBar();
JMenu世界菜单=新JMenu(“世界”);
菜单栏。添加(世界菜单);
JMenu indMenu=新JMenu(“印度”);
添加(indMenu);
/*创建菜单*/
JMenu odMenu=新JMenu(“Odisha”);
indMenu.add(odMenu);
JMenu delhiMenu=新德里;
indMenu.add(delhiMenu);
JMenu upMenu=新JMenu(“北方邦”);
indMenu.add(向上菜单);
JMenu mpMenu=新JMenu(“中央邦”);
indMenu.add(mpMenu);
JMenu auscmenu=新JMenu(“澳大利亚”);
添加(菜单);
JMenu AmericaMenu=新JMenu(“美国”);
添加(AmericaMenu);
/*创建子菜单*/
JMenu bbMenu=新JMenu(“Bhubaneswar”);
odMenu.add(bbMenu);
JMenu bmMenu=新JMenu(“Berhampur”);
odMenu.add(bmMenu);
/*创建子菜单*/
JMenuItem rjMenuItem=新JMenuItem(“Raj Mahal”);
bbMenu.add(rjMenuItem);
JMenuItem abMenuItem=新JMenuItem(“阿查里亚比哈尔”);
bbMenu.add(abMenuItem);
JMenuItem bMenuItem=新的JMenuItem(“巴尼比哈尔”);
bbMenu.add(bMenuItem);
/*检索路径*/
MenuSelectManager.defaultManager().addChangeListener(
新的ChangeListener(){
公共无效状态已更改(ChangeEvent evt){
MenuElement[]路径=MenuSelectManager.defaultManager()
.getSelectedPath();
//
int s=0;
for(int i=0;i
如何获取当前选定的

  • 菜单-无法选择父菜单。你为什么想知道 如果鼠标在上面
  • 菜单项-拥抱动作界面
  • 这是一个非常普遍的疏忽,不使用的。当用Swing开发时,让行动成为你的朋友,它会对你很好。您使用MenuSelectionManager时走错了路

    import javax.swing.*;
    import java.awt.*;
    import java.awt.event.ActionEvent;
    
    public class MenuExample {
        private JFrame frame;
        private JLabel choiceIndicator;
    
        MenuExample create() {
            frame = createFrame();
            choiceIndicator = new JLabel();
            frame.setJMenuBar(createMenuBar());
            frame.getContentPane().add(createContent());
    
            return this;
        }
    
        private Component createContent() {
            JPanel panel = new JPanel();
    
            panel.add(new JLabel("Last menu item choice:"));
            panel.add(choiceIndicator);
    
            return panel;
        }
    
        private JMenuBar createMenuBar() {
            JMenuBar menuBar = new JMenuBar();
            menuBar.add(createWorld());
            return menuBar;
        }
    
        private JMenu createWorld() {
            JMenu worldMenu = new JMenu("World");
    
            worldMenu.add(createIndia());
            worldMenu.add(new JMenu("Australia"));
            worldMenu.add(new JMenu("America"));
    
            return worldMenu;
        }
    
        private JMenu createIndia() {
            JMenu india = new JMenu("India");
    
            india.add(createOdisha());
            india.add(new JMenu("Delhi"));
            india.add(new JMenu("Uttar Pradesh"));
            india.add(new JMenu("Madhya Pradesh"));
    
            return india;
        }
    
        private JMenuItem createOdisha() {
            JMenu menu = new JMenu("Odisha");
    
            menu.add(createBhubaneswar());
            menu.add(new JMenu("Berhampur"));
    
            return menu;
        }
    
        private JMenuItem createBhubaneswar() {
            JMenu menu = new JMenu("Bhubaneswar");
            menu.add(choiceItem("Raj Mahal"));
            menu.add(choiceItem("Acharya Bihar"));
            menu.add(choiceItem("Bani Bihar"));
    
            return menu;
        }
    
        private JMenuItem choiceItem(String text) {
            return new JMenuItem(new Choice(text, choiceIndicator));
        }
    
        private JFrame createFrame() {
            JFrame frame = new JFrame(getClass().getSimpleName());
            frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    
            return frame;
        }
    
        void show() {
            frame.setSize(350, 250);
            frame.setResizable(false);
            frame.setLocationRelativeTo(null);
            frame.setVisible(true);
        }
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
                @Override
                public void run() {
                    new MenuExample().create().show();
                }
            });
        }
    
        class Choice extends AbstractAction {
            private final JLabel choiceIndicator;
    
            public Choice(String text, JLabel choiceIndicator) {
                this(text, null, null, null, choiceIndicator);
            }
    
            public Choice(String text, ImageIcon icon, String desc, Integer mnemonic, JLabel choiceIndicator) {
                super(text, icon);
                putValue(SHORT_DESCRIPTION, desc);
                putValue(MNEMONIC_KEY, mnemonic);
    
                this.choiceIndicator = choiceIndicator;
            }
    
            public void actionPerformed(ActionEvent e) {
                choiceIndicator.setText(e.getActionCommand());
            }
        }
    }
    

    请发布您尝试过的内容?发布代码@Tamilselvan,您的代码中有什么不起作用?当我将鼠标悬停在菜单上时,它会显示访问过的菜单,我想修改它,因为单击特定菜单和子菜单时,将打印选定的路径@MadProgrammer@javajon请帮助解决这个问题。非常感谢先生,我会记住你提到的所有这些概念。