2009-08-30 135 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