如何在 Java 中创建带有子菜单的弹出菜单
Posted
技术标签:
【中文标题】如何在 Java 中创建带有子菜单的弹出菜单【英文标题】:How To Create a Pop Up Menu with Sub Menu in 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);
但是我想向这些菜单添加子菜单,例如用户将鼠标悬停在“部分”菜单中,子菜单将打开并显示部分。
【问题讨论】:
【参考方案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 tutorial 或 submenu examble
【讨论】:
【参考方案2】:将JMenu
实例添加到您的JPopupMenu
。 JMenu
当然应该包含 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());
【讨论】:
以上是关于如何在 Java 中创建带有子菜单的弹出菜单的主要内容,如果未能解决你的问题,请参考以下文章