我知道如何使用JMenu创建Java Swing子菜单。当我们将鼠标悬停在一个JMenu的对象,它会显示一个JPopupMenu中显示的子菜单项,如:使用JMenu的动态创建Java Swing子菜单
子菜单我的问题是,在我的应用程序,确定哪些菜单元素将有一个子菜单是昂贵的。我不想事先确定一个特定的菜单元素是JMenu还是JMenuItem。我想让每个元素都成为JMenuItem,并且只有当用户请求时才显示子菜单,例如,将鼠标悬停在菜单项上。像这样:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Menu2 extends JFrame
{
public Menu2()
{
super("Menu2");
JMenuBar menuBar = new JMenuBar();
setJMenuBar(menuBar);
JMenu mItems = new JMenu("Items");
menuBar.add(mItems);
mItems.add(new JMI("A"));
mItems.add(new JMI("B"));
mItems.add(new JMI("C"));
JLabel stuff = new JLabel("Other stuff");
stuff.setPreferredSize(new Dimension(200,200));
getContentPane().add(stuff);
pack();
setDefaultCloseOperation(EXIT_ON_CLOSE);
setLocationRelativeTo(null);
}
private class JMI extends JMenuItem
implements MouseListener
{
public JPopupMenu childrenPopup = null;
public JMI(String label)
{
super(label);
addMouseListener(this);
}
// MouseListener
public void mouseClicked(MouseEvent ev) {}
public void mouseEntered(MouseEvent ev)
{
// Show a submenu for item "B" only.
// In real life we'd want a Timer to delay showing the submenu
// until we are sure the user is hovering the mouse.
// For simplicity I've omitted it.
if (getText().equals("B")) {
if (childrenPopup == null) {
childrenPopup = new JPopupMenu();
// Expensive processing to determine submenu elements...
childrenPopup.add("D");
childrenPopup.add("E");
}
// Display the submenu
childrenPopup.show(this,getWidth(),0);
}
}
public void mouseExited(MouseEvent ev) {}
public void mousePressed(MouseEvent ev) {}
public void mouseReleased(MouseEvent ev) {}
}
public static void main(String[] args)
throws Exception
{
new Menu2().setVisible(true);
}
}
唯一的问题是当我手动创建的JPopupMenu被显示时,菜单的其余部分被关闭。显示结果并不像较早的企业之一,而像这样:
子菜单手动显示
请注意,我没有点击在“B”菜单项,只有感动将鼠标放入它。由于鼠标点击,菜单没有关闭。
我该如何做JMenu所做的 - 在不关闭菜单的其余部分的情况下显示JPopupMenu?
也许你可以尝试用JMenu的替代JMenuItem的,一旦你确定它确实确实有子菜单。 – camickr
我认为像这样的一个新成语会让用户感到困惑,并且最好让菜单条目始终是一个JMenuItem,它会显示一个显示动态确定选项的模式对话框(可能是一个JOptionPane)。 – VGR
谢谢,camickr和VGR,为您提供了解决方法的建议。即使我必须使用解决方法,我也确实想知道为什么显示弹出菜单会导致菜单关闭。很明显,它可以在不关闭菜单的情况下完成,因为JMenu可以做到这一点。 – Vine