1

ポップアップメニュー付きのアプリケーションがあります。ポップアップを通常の方法で使用したいのですが(つまり、ユーザーがウィンドウ内の任意の場所を右クリックしたときに表示されるはずです)、ウィンドウ上部のメインメニューバーにもポップアップを添付したいと思います。これを行う方法がわかりません。

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

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

誰か提案はありますか?

4

2 に答える 2

0

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

Action JavaDocから:

ActionListenerインターフェースによって定義されたactionPerformedメソッドに加えて、このインターフェースにより、アプリケーションは1つの場所で以下を定義できます。

  • 関数を説明する1つ以上のテキスト文字列。これらの文字列は、たとえば、ボタンのフライオーバーテキストを表示したり、メニュー項目にテキストを設定したりするために使用できます。
  • 関数を表す1つ以上のアイコン。これらのアイコンは、メニューコントロールの画像、またはより高度なユーザーインターフェイスの複合エントリに使用できます。
  • 機能の有効/無効状態。メニュー項目とツールバーボタンを別々に無効にする代わりに、アプリケーションはこのインターフェイスを実装する機能を無効にすることができます。状態変更のリスナーとして登録されているすべてのコンポーネントは、そのアイテムのイベント生成を無効にし、それに応じて表示を変更することを認識しています。

JPopupMenuJToolBarおよびJMenuすべては、コンポーネントを作成し、対応するコンポーネントにアクションを設定するための便利なメソッドを提供します。詳細については、これらの各クラスを参照してください。

于 2010-12-11T03:19:20.603 に答える
0

私も同じ問題を抱えていました。マウスを右クリックするだけでなく、まったく同じ(複雑な)メニュー項目のセットを含むトップメニュー。'Action'クラスは、有効化の選択について話している場合に考慮すべきものですが、可視性を扱っておらず、私の場合、再利用したい現在の選択に基づいたエントリの動的リストもありました。

そのため、実際に使用するメソッド(add()およびaddSeparator())に「Bridge」デザインパターン(私は思う)を実装することになりました。

  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();
      }});
于 2017-05-31T09:17:44.247 に答える