2010-12-11 14 views
1

私はポップアップメニューを持つアプリケーションを持っています。通常の方法でポップアップを使用したいと思います(つまり、ユーザーがウィンドウ内の任意の場所を右クリックすると表示されます)。ウィンドウの上部にあるメインMenuBarにも貼り付けたいと思います。私はこれを行う方法がわかりません。JPopupMenuをJMenuBarに追加するにはどうすればよいですか?

myJMenuBar.add(myPopupMenu) を呼び出すのは簡単だと思いますが、これは機能しません。

JMenuBar.add()はJPopupMenuではなくJMenuパラメータを必要とします。

誰にも提案はありますか?

答えて

0

JPopupMenuオブジェクトを再利用するのではなく、メニューが実行するアクションをカプセル化して再利用するのが最善の方法です。メニュー項目と同様に、ポップアップがこれらのアクションをトリガーします。 ActionJavaDocから

  • つまたは複数のテキスト:

    ActionListenerインタフェースによって定義されるactionPerformedメソッドに加えて、このインタフェースは、単一の場所で、アプリケーションが定義することができ関数を記述する文字列。これらの文字列は、たとえば、ボタンのフライオーバーテキストを表示したり、メニュー項目にテキストを設定するために使用できます。

  • 機能を表す1つ以上のアイコン。これらのアイコンは、メニューコントロールの画像や、より洗練されたユーザーインターフェイスの合成項目に使用できます。
  • 機能の有効/無効状態。アプリケーションは、メニュー項目とツールバーボタンを個別に無効にする代わりに、このインターフェイスを実装する機能を無効にすることができます。ステート変更のリスナーとして登録されているすべてのコンポーネントは、そのアイテムのイベント生成を無効にし、それに応じてディスプレイを変更することを認識します。

JPopupMenuJToolBarJMenuすべてのコンポーネントを作成し、対応するコンポーネントにアクションを設定するための便利な方法を提供します。詳細は各クラスを参照してください。

0

私は同じ問題がありました。右マウス・クリックだけでなく、全く同じ(複雑な)メニュー項目のセットを持つトップ・メニュー。 「アクション」クラスは、使用可能な選択肢について話している場合には考慮する必要がありますが、可視性を扱うのではなく、私が再利用したい現在の選択肢に基づいてエントリの動的リストがあります。

だから私は、私が実際に使用した方法のための「橋」の設計パターンを(と思う)実装することになった((追加)とaddSeparator()):

public static class MenuBridge 
    { 
    private JPopupMenu popupMenu; 
    private JMenu menu; 

    public MenuBridge(JPopupMenu popupMenu) 
    { 
     this.popupMenu = popupMenu; 
    } 

    public MenuBridge(JMenu menu) 
    { 
     this.menu = menu; 
    } 

    public void addSeparator() 
    { 
     if(popupMenu!=null) popupMenu.addSeparator(); 
     else menu.addSeparator(); 
    } 

    public void add(JMenuItem item) 
    { 
     if(popupMenu!=null) popupMenu.add(item); 
     else menu.add(item); 
    } 
    } 

それでは、私は、再利用可能なメソッドを書くことができますメニューアイテムを計算し、右クリックとトップレベルメニューを同期させます:

public void addTaskMenuItems(DefaultMenu menu, List<MDProcTask> taskList) 
{ 
    ... 
    menu.add()/menu.addSeparator() 
    ... 
} 

addTaskMenuItems(new DefaultMenu(popupMenu),taskList); 
... 
taskMenu.addMenuListener(new MenuListener() { 
     public void menuCanceled(MenuEvent menuevent) 
     { 
     } 
     public void menuDeselected(MenuEvent menuevent) 
     { 
     } 
     public void menuSelected(MenuEvent menuevent) 
     { 
     taskMenu.removeAll(); 
     addTaskMenuItems(new DefaultMenu(taskMenu),getSelectedTasks()); 
     taskMenu.revalidate(); 
     }}); 
関連する問題