我有一个正在用 Java 实现的新 UI,我在实现一个包含 JMenu(以及几个 JMenuItems)的 JPopupMenu 时遇到了麻烦,它本身包含几个 JMenuItems。JPopupMenu 出现在我单击人民币的位置,它看起来不错,但是当我将鼠标悬停时,“连接”JMenu 似乎没有任何孩子,尽管我尽了最大努力 .add() 它们。
在网上查看了几个示例后,我还没有看到任何专门为 mouseEntered() 实现侦听器以推出子项的示例。我想我在我的菜单初始化方法中搞砸了。
我已附上相关代码供您阅读。
//Elsewhere...
private JPopupMenu _clickMenu;
//End Elsehwere...
private void initializeMenu()
{
_clickMenu = new JPopupMenu();
_clickMenu.setVisible(false);
_clickMenu.add(generateConnectionMenu());
JMenuItem menuItem;
menuItem = new JMenuItem("Configure");
addMenuItemListeners(menuItem);
_clickMenu.add(menuItem);
menuItem = new JMenuItem("Status");
addMenuItemListeners(menuItem);
_clickMenu.add(menuItem);
}
private JMenu generateConnectionMenu()
{
JMenu menu = new JMenu("Connect");
List<Port> portList = _database.getAllPortsInCard(_cardId);
for(int i = 0; i < portList.size(); i++)
{
menu.add(new JMenuItem(portList.get(i).getName()));
}
return menu;
}
该代码当然不是最漂亮的,但对我来说放轻松,因为在我试图弄清楚为什么它不起作用时,今天在时间允许的情况下它被修改了太多次。我认为这可能是范围问题,但我尝试了一些不同的代码配置无济于事。随意提出任何后续问题或打我一个明显的疏忽(以前发生过......)。谢谢大家!
编辑:
将此归结为缺乏 Java 和 Swing 经验……我是手动定位并使其JPopupMenu
可见,而不是使用该JComponent.setComponentPopupMenu(menu)
方法。对上图中的卡片模块(本身是一个 JButton)执行此操作后,子菜单会正确显示。下面包含了初始化代码的不同功能版本。
private void initializeMenu()
{
_cardMenu = new JPopupMenu();
JMenu menu = new JMenu("Connect");
JMenuItem menuItem;
menuItem = new JMenuItem("1");
menu.add(menuItem);
menuItem = new JMenuItem("2");
menu.add(menuItem);
_cardMenu.add(menu);
_cardMenu.add(new JMenuItem("Configure"));
_cardMenu.add(new JMenuItem("Status"));
_mainButton.setComponentPopupMenu(_cardMenu); //Important, apparently!
}
所以,吸取教训。谢谢你们的帮助!