Samples > ポップアップメニューを作成する(JFace編)

 

ポップアップメニューを作成する (JFace編)

JFaceのフレームワークを使って、任意のウィジェットでマウスの右クリックで表示されるポップアップメニューの作り方を説明します。JFaceのアクションクラスをMenuManagerに登録し、ウィジェットのControl#setMenu(Menu)メソッドを使って、メニューと関連付けます。イディオムとしては以下のようになります。

Control c = new ...;
MenuManager mm = new MenuManager();
mm.add(new Action1());
mm.add(new Action2());
...

c.setMenu(mm.createContextMenu(c));

サンプルプログラム

CTabFolderにコンテキストメニューを追加した例を示しているサンプルプログラムです。タブの上で右クリックするとコンテキストメニューが表示されます。JFaceのアクションを使っているので、コンテキストメニューで使われているのと同じアクションをメニューバーにそのまま利用できます。

ソースコード (JFacePopupMenuTest.java)

import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.window.ApplicationWindow;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CTabFolder;
import org.eclipse.swt.custom.CTabItem;
import org.eclipse.swt.layout.*;
import org.eclipse.swt.widgets.*;

public class JFacePopupMenuTest extends ApplicationWindow {

   private CTabFolder tabFolder;
   private Action closeTabAction;
   private Action closeAllTabExceptThisAction;

   private MenuManager menuManager;
   public JFacePopupMenuTest() {
      super(null);

      closeTabAction = new CloseTabAction();
      closeAllTabExceptThisAction = new CloseAllTabExceptThisAction();

      //メニューマネージャーの初期化
      menuManager = new MenuManager();
      menuManager.add(closeTabAction);
      menuManager.add(closeAllTabExceptThisAction);

      addMenuBar();
   }

   public static void main(String[] args) {
      ApplicationWindow w = new JFacePopupMenuTest();
      w.setBlockOnOpen(true);
      w.open();
      Display.getCurrent().dispose();
   }

   protected Control createContents(Composite parent) {
      getShell().setText("JFacePopupMenuTest");
      Composite container = new Composite(parent, SWT.NONE);
      container.setLayout(new FillLayout());

      tabFolder = createTabFolder(container);

      //コンテキストメニューのセット
      tabFolder.setMenu(menuManager.createContextMenu(tabFolder));

      getShell().setSize(300, 200);

      return container;
   }

   protected MenuManager createMenuManager() {
      MenuManager menuBar = new MenuManager();
      MenuManager tabMenu = new MenuManager("タブ");
      tabMenu.add(closeTabAction);
      tabMenu.add(closeAllTabExceptThisAction);
      menuBar.add(tabMenu);
      return menuBar;
   }

   private CTabFolder createTabFolder(Composite parent) {
      CTabFolder tf = new CTabFolder(parent, SWT.NONE);
      tf.setBorderVisible(true);
      for (int i = 0; i < 4; i++) {
         CTabItem item = new CTabItem(tf, SWT.NONE);
         item.setText("Tab" + i);
         item.setControl(new Text(tf, SWT.NONE));
      }
      return tf;
   }

   private void closeSelectedTab() {
      //選択されているタブの消去
      CTabItem item = tabFolder.getSelection();

      //末尾にあるタブを直接消去するとExceptionが発生する問題の回避策
      int count = tabFolder.getItemCount();
      if (item == tabFolder.getItem(count - 1)) {
         //末尾にあるタブの場合
         if (count - 1 > 0) {
            tabFolder.setSelection(count - 2);
         }
      }
      item.dispose();
      if (tabFolder.getItemCount() == 0) {
         setActionsEnable(false);
      }
   }

   private void closeAllTabsExceptSelectedTab() {
      //選択されている以外のタブをすべて閉じる
      CTabItem activeItem = tabFolder.getSelection();
      CTabItem[] items = tabFolder.getItems();
      for (int i = 0; i < items.length; i++) {
         if (activeItem != items[i]) {
            items[i].dispose();
         }
      }
   }

   private void setActionsEnable(boolean b) {
      closeTabAction.setEnabled(b);
      closeAllTabExceptThisAction.setEnabled(b);
   }

   class CloseTabAction extends Action {
      public CloseTabAction() {
         setText("閉じる");
      }
      public void run() {
         closeSelectedTab();
      }
   }

   class CloseAllTabExceptThisAction extends Action {
      public CloseAllTabExceptThisAction() {
         setText("これ以外のタブを閉じる");
      }
      public void run() {
         closeAllTabsExceptSelectedTab();
      }
   }
}


最新更新日: 2005年6月13日
 
関連リンク
Eclipse API ドキュメント

- PR -

マイクロソフト お得な見積! まとめての購入ならオトクな方法で。ライセンスだから管理も簡単。

シマンテック 割引価格! オンライン販売だから低価格。いつでも簡単、見積・購入。

■原石のままでは、終わりたくない貴方へ!キャリアアップ転職を成功へとナビゲート

秋葉原・なんば・名古屋・札幌に店舗を構えるパソコンショップ!【ツクモ】


Copyright(C) 2003,2004 Jasmin Project. All Right Reserved.
SEO [PR] 爆速!無料ブログ 無料ホームページ開設 無料ライブ放送