JMenuItem.getRootPane()解决方法?

时间:2009-08-30 10:41:20

标签: java swing

使用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);
  }

3 个答案:

答案 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();