2009-08-30 28 views
2

well-knownのようですが、JMenuItem.getRootPane()を使用するとバグがあります。 私はバグの説明を読みましたが、私は回避策を見つけることができません。 Action.actionPerformed()メソッドで回避コードを知っていますか?JMenuItem.getRootPane()回避策?

更新:私はこれを今でも受けていますが、それはサブメニューでは機能しません。 ((JPopupMenuを)((JMenuItemを)((JMenuItemを)C).getParent(:

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() 例追加する必要があります))。getParent())。getInovker();)。

1

あなたはそれが各コンテキスト(各ウィンドウ、または何でも)のために別のアクションインスタンスを作成するために、より簡単に、それは上で動作する必要があるものは何でもしてActionを初期化するために、必要に応じて見つけるかもしれません。確かにコードは読みやすくなります。 :)

+0

私はこれまでにこれを持っていましたが、コードが読みやすくて簡単ではないと思います。デフォルトのActionコンストラクタをw/o引数として使用することはできません。ありがとうございました。 – PeterMmm