使用JMenuItem.getRootPane()似乎是well-known存在错误。 我阅读了错误描述,但我找不到解决方法。 您是否在Action.actionPerformed()方法中了解了解决此问题的代码?
更新:我现在得到了这个但是不能用于子菜单。
public void actionPerformed(ActionEvent e) {
Component c = (Component) e.getSource();
if (c instanceof JMenuItem) {
c = ((JPopupMenu)((JMenuItem)c).getParent()).getInvoker();
}
Component z = SwingUtilities.getRootPane(c);
}
答案 0 :(得分:2)
有趣。您不能只使用getParent(),因为每个子菜单都有自己的弹出菜单。因此,您必须找到链中的所有菜单,直到找到JMenu作为其父级的JMenuBar。然后,您可以使用该菜单查找根窗格。像这样:
public JMenu getMenuBarMenu(JMenuItem item)
{
JMenuItem menu = null;
while (menu == null)
{
JPopupMenu popup = (JPopupMenu)item.getParent();
item = (JMenuItem)popup.getInvoker();
if (item.getParent() instanceof JMenuBar)
menu = item;
}
return (JMenu)menu;
}
答案 1 :(得分:1)
您可能会发现使用它需要处理的任何内容更容易初始化Action
,并且如果有必要为每个上下文(每个窗口或其他任何内容)创建单独的操作实例。当然代码会更容易阅读。 :)
答案 2 :(得分:0)
要使此子解决方案适用于子菜单,您需要添加另一个.getParent() 例: ((JPopupMenu的)((JMenuItem的)((JMenuItem的)C).getParent())的getParent()。)getInovker();