【问题标题】:How To Create a Pop Up Menu with Sub Menu in Java如何在 Java 中创建带有子菜单的弹出菜单
【发布时间】:2011-12-01 12:00:58
【问题描述】:

我想为我的程序添加右键菜单。我使用以下代码添加了基本菜单:

            Pmenu = new JPopupMenu("Menu");
            menuItem = new JMenuItem("Sections");
            Pmenu.add(menuItem);
            menuItem = new JMenuItem("Numbers");
            Pmenu.add(menuItem);

但是我想向这些菜单添加子菜单,例如用户将鼠标悬停在“部分”菜单中,子菜单将打开并显示部分。

【问题讨论】:

    标签: java swing menu right-click jpopupmenu


    【解决方案1】:

    首先,对象名称通常以小写字母开头,大写字母通常用于类/接口名称。

    对于您的问题,这里是子菜单的代码

    //parent menu
    JPopupMenu pmenu = new JPopupMenu("Menu");
    
    //sub menu
    JMenu sectionsMenu = new JMenu("Sections");
    JMenuItem menuItem1 = new JMenuItem("Item1");
    sectionsMenu .add(menuItem1 );
    JMenuItem menuItem2 = new JMenuItem("Item2");
    sectionsMenu .add(menuItem2 );
    
    pmenu.add(sectionsMenu);
    
    //regular menu item
    menuItem = new JMenuItem("Numbers");
    pmenu.add(menuItem);
    

    JMenu tutorialsubmenu examble

    【讨论】:

      【解决方案2】:

      JMenu 实例添加到您的JPopupMenuJMenu 当然应该包含 JMenuItem 实例。

      请参阅http://download.oracle.com/javase/tutorial/uiswing/components/menu.html,了解有关 Swing 菜单的教程。

      【讨论】:

      • 我在菜单栏中使用了 JMenu,但是当用户右键单击时,我应该如何在确切位置显示该菜单?
      • 使用myPanel.setComponentPopupMenu(popupMenu),右键myPanel会出现弹出菜单。
      【解决方案3】:
      public JMenuBar createMenuBar() {
          JMenuBar menuBar;
          JMenu menu, submenu;
          JMenuItem menuItem;
          JRadioButtonMenuItem rbMenuItem;
          JCheckBoxMenuItem cbMenuItem;
      
          //Create the menu bar.
          menuBar = new JMenuBar();
      
          //Build the first menu.
          menu = new JMenu("A Menu");
          menu.setMnemonic(KeyEvent.VK_A);
          menu.getAccessibleContext().setAccessibleDescription(
                  "The only menu in this program that has menu items");
          menuBar.add(menu);
      
          //a group of JMenuItems
          menuItem = new JMenuItem("A text-only menu item",
                                   KeyEvent.VK_T);
          //menuItem.setMnemonic(KeyEvent.VK_T); //used constructor instead
          menuItem.setAccelerator(KeyStroke.getKeyStroke(
                  KeyEvent.VK_1, ActionEvent.ALT_MASK));
          menuItem.getAccessibleContext().setAccessibleDescription(
                  "This doesn't really do anything");
          menuItem.addActionListener(this);
          menu.add(menuItem);
      
          ImageIcon icon = createImageIcon("images/middle.gif");
          menuItem = new JMenuItem("Both text and icon", icon);
          menuItem.setMnemonic(KeyEvent.VK_B);
          menuItem.addActionListener(this);
          menu.add(menuItem);
      
          menuItem = new JMenuItem(icon);
          menuItem.setMnemonic(KeyEvent.VK_D);
          menuItem.addActionListener(this);
          menu.add(menuItem);
      
          //a group of radio button menu items
          menu.addSeparator();
          ButtonGroup group = new ButtonGroup();
      
          rbMenuItem = new JRadioButtonMenuItem("A radio button menu item");
          rbMenuItem.setSelected(true);
          rbMenuItem.setMnemonic(KeyEvent.VK_R);
          group.add(rbMenuItem);
          rbMenuItem.addActionListener(this);
          menu.add(rbMenuItem);
      
          rbMenuItem = new JRadioButtonMenuItem("Another one");
          rbMenuItem.setMnemonic(KeyEvent.VK_O);
          group.add(rbMenuItem);
          rbMenuItem.addActionListener(this);
          menu.add(rbMenuItem);
      
          //a group of check box menu items
          menu.addSeparator();
          cbMenuItem = new JCheckBoxMenuItem("A check box menu item");
          cbMenuItem.setMnemonic(KeyEvent.VK_C);
          cbMenuItem.addItemListener(this);
          menu.add(cbMenuItem);
      
          cbMenuItem = new JCheckBoxMenuItem("Another one");
          cbMenuItem.setMnemonic(KeyEvent.VK_H);
          cbMenuItem.addItemListener(this);
          menu.add(cbMenuItem);
      
          //a submenu
          menu.addSeparator();
          submenu = new JMenu("A submenu");
          submenu.setMnemonic(KeyEvent.VK_S);
      
          menuItem = new JMenuItem("An item in the submenu");
          menuItem.setAccelerator(KeyStroke.getKeyStroke(
                  KeyEvent.VK_2, ActionEvent.ALT_MASK));
          menuItem.addActionListener(this);
          submenu.add(menuItem);
      
          menuItem = new JMenuItem("Another item");
          menuItem.addActionListener(this);
          submenu.add(menuItem);
          menu.add(submenu);
      
          //Build second menu in the menu bar.
          menu = new JMenu("Another Menu");
          menu.setMnemonic(KeyEvent.VK_N);
          menu.getAccessibleContext().setAccessibleDescription(
                  "This menu does nothing");
          menuBar.add(menu);
      
          return menuBar;
      }
      
      public Container createContentPane() {
          //Create the content-pane-to-be.
          JPanel contentPane = new JPanel(new BorderLayout());
          contentPane.setOpaque(true);
      
          //Create a scrolled text area.
          output = new JTextArea(5, 30);
          output.setEditable(false);
          scrollPane = new JScrollPane(output);
      
          //Add the text area to the content pane.
          contentPane.add(scrollPane, BorderLayout.CENTER);
      
          return contentPane;
      }
      
      public void createPopupMenu() {
          JMenuItem menuItem;
      
          //Create the popup menu.
          JPopupMenu popup = new JPopupMenu();
          menuItem = new JMenuItem("A popup menu item");
          menuItem.addActionListener(this);
          popup.add(menuItem);
          menuItem = new JMenuItem("Another popup menu item");
          menuItem.addActionListener(this);
          popup.add(menuItem);
      
          //Add listener to the text area so the popup menu can come up.
          MouseListener popupListener = new PopupListener(popup);
          output.addMouseListener(popupListener);
      }
      
      public void actionPerformed(ActionEvent e) {
          JMenuItem source = (JMenuItem)(e.getSource());
          String s = "Action event detected."
                     + newline
                     + "    Event source: " + source.getText()
                     + " (an instance of " + getClassName(source) + ")";
          output.append(s + newline);
          output.setCaretPosition(output.getDocument().getLength());
      }
      
      public void itemStateChanged(ItemEvent e) {
          JMenuItem source = (JMenuItem)(e.getSource());
          String s = "Item event detected."
                     + newline
                     + "    Event source: " + source.getText()
                     + " (an instance of " + getClassName(source) + ")"
                     + newline
                     + "    New state: "
                     + ((e.getStateChange() == ItemEvent.SELECTED) ?
                       "selected":"unselected");
          output.append(s + newline);
          output.setCaretPosition(output.getDocument().getLength());
      }
      
      // Returns just the class name -- no package info.
      protected String getClassName(Object o) {
          String classString = o.getClass().getName();
          int dotIndex = classString.lastIndexOf(".");
          return classString.substring(dotIndex+1);
      }
      
      /** Returns an ImageIcon, or null if the path was invalid. */
      protected static ImageIcon createImageIcon(String path) {
          java.net.URL imgURL = PopupMenuDemo.class.getResource(path);
          if (imgURL != null) {
              return new ImageIcon(imgURL);
          } else {
              System.err.println("Couldn't find file: " + path);
              return null;
          }
      }
      
      /**
       * Create the GUI and show it.  For thread safety,
       * this method should be invoked from the
       * event-dispatching thread.
       */
      
      
      
      
      private static void createAndShowGUI() {
          //Create and set up the window.
          JFrame frame = new JFrame("PopupMenuDemo");
          frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      
          //Create/set menu bar and content pane.
          PopupMenuDemo demo = new PopupMenuDemo();
          frame.setJMenuBar(demo.createMenuBar());
          frame.setContentPane(demo.createContentPane());
      
          //Create and set up the popup menu.
          demo.createPopupMenu();
      
          //Display the window.
          frame.setSize(450, 260);
          frame.setVisible(true);
      }
      
      public static void main(String[] args) {
          //Schedule a job for the event-dispatching thread:
          //creating and showing this application's GUI.
          javax.swing.SwingUtilities.invokeLater(new Runnable() {
              public void run() {
                  createAndShowGUI();
              }
          });
      }
      
      class PopupListener extends MouseAdapter {
          JPopupMenu popup;
      
          PopupListener(JPopupMenu popupMenu) {
              popup = popupMenu;
          }
      
          public void mousePressed(MouseEvent e) {
              maybeShowPopup(e);
          }
      
          public void mouseReleased(MouseEvent e) {
              maybeShowPopup(e);
          }
      
          private void maybeShowPopup(MouseEvent e) {
              if (e.isPopupTrigger()) {
                  popup.show(e.getComponent(),
                             e.getX(), e.getY());
              }
          }
      }
      

      }

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-04-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-10-20
        • 2013-09-03
        • 1970-01-01
        相关资源
        最近更新 更多