2009-08-30 187 views
2

它似乎是well-known使用JMenuItem.getRootPane()时有一个错误。 我读了错误描述,但我找不出解决方法。 您是否知道Action.actionPerformed()方法中的解决方法?JMenuItem.getRootPane()解决方法?

更新:我现在得到这个,但不适用于子菜单。

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

回答

2

有趣。你不能继续使用getParent(),因为每个子菜单都有自己的弹出式菜单。因此,您必须找到链中的所有菜单,直到找到一个JMenuBar作为其父项的JMenu。然后,您可以使用该菜单查找根窗格。事情是这样的:

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; 
} 
0

要获得子菜单此变通办法工作,你需要添加另一个.getParent() 例子: ((JPopupMenu的)((JMenuItem的)((JMenuItem的)C).getParent( ))的getParent())getInovker()。;

1

您可能会发现更容易与需要的地方工作,在初始化Action,并在必要时为每个上下文(每个窗口,或其他)创建单独的行动实例。当然,代码将更容易阅读。 :)

+0

我有这个之前,但我不认为代码是重要的更容易阅读,我不能使用默认的Action构造w/o参数。谢谢。 – PeterMmm 2009-08-31 09:56:32