Eclipse Workbench以外でのEclipse GUIの使用 第3回: アクション、メニュー、およびツールバーを追加する

シンプルなファイル・エクスプローラー・アプリケーションの作成

シリーズ最後のこの第3回目の記事では、A. O. Van Emmenis氏が、第1回および第2回の記事で開始したファイル・エクスプローラーの例に、アクション、メニューバー、ポップアップ・メニュー、およびツールバーを追加して完成させます。メニュー項目プロパティーの設定方法、メニューおよびツールバーでのアクションの再利用方法、ビューアーからイベントをリッスンすることによってアクションをコンテキスト・センシティブにする方法を説明します。この例のアクションは、ユーティリティーを使用してプログラムを起動し、システム・クリップボードにアクセスします。

Adrian Emmenis (van@vanemmenis.com), Independent consultant

Photo of authorA. O. Van Emmenis氏は、Java/J2EEのトレーニングとコンサルティングを専門とする、イギリス、ケンブリッジを基盤に活躍する独立系コンサルタントです。Van氏は、これまで20年にわたってソフトウェア業界に関わってきました。CAD業界においてSmalltalkを使用したオブジェクトの操作からキャリアを開始し、現在は主にJavaを扱っています。彼は、特にアジャイル・メソッドとGUIの設計に関心を寄せています。Vanの連絡先は、van@vanemmenis.com です。



2003年 3月 04日

はじめに

このシリーズの第1回では、JFaceのアプリケーション・ウィンドウをサブクラス化し、ツリー・ビューアーとテーブル・ビューアーを使用してフォルダーとファイルを表示する例から説明を始めました。第2回では、見栄えを整え、JFaceのイメージ・レジストリーを使用してアイコンを追加しました。

今回は、アクションを取り上げ、メニューとツールバーで使用できるようにします。プログラムを起動するためのProgram クラスと、システム・クリップボードにアクセスするためのClipboard クラスの使用について説明します。ビューアーにファイルとフォルダーを表示するためのアイコンは既に使用しました。今回は、メニューとツールバーでのアイコンの使用法を説明します。最後に、アクションをコンテキスト・センシティブにするため、ビューアーからのイベントをリッスンするようにアクションを設定します。

インストール上の注意点

この記事のサンプル・ソース・コードをダウンロードできます。このソース・コードを実行するには、以下のシステム設定が必要です。

  • Windows 2000
  • Ecipse Stable Build M3 (2002年11月15日)
  • Eclipseのインストール場所 - C:\eclipse-2.1.0

これ以降出てくる名前とファイルの区切り文字の変更は自由です。使用しているシステムでプログラムが正しく動作する範囲で変更してください。

作成と実行の手順

クラスパスに次の .jarファイルが必要です。 C:\eclipse-2.1.0\plugins\org.eclipse.jface_2.1.0\jface.jar
C:\eclipse-2.1.0\plugins\org.eclipse.runtime_2.1.0\runtime.jar
C:\eclipse-2.1.0\plugins\org.eclipse.swt.win32_2.1.0\ws\win32\swt.jar
C:\eclipse-2.1.0\plugins\org.eclipse.ui.workbench_2.1.0\workbench.jar
C:\eclipse-2.1.0\plugins\org.eclipse.core.runtime_2.1.0\runtime.jar

実行時にJava VM (仮想マシン) が、使用するGUIの正しい共有ライブラリーを選択するよう、次の引数を使用して実行してください。

-Djava.library.path=C:\eclipse-2.1.0\plugins\org.eclipse.swt.win32_2.1.0\os\win32\x86\

最後に、サンプル・アプリケーションでアイコンを含む .gifファイルを見つけられるよう、icons フォルダーを下位フォルダーに持つフォルダーからプログラムを実行してください。


第2回のサンプルからの続き

前回の記事で、Explorerアプリケーションは最後に図1のようになりました。

図1. Explorer (バージョン8)
図1. Explorer (バージョン8)

左側のペインには、ツリー・ビューアーを使用してフォルダーが表示されています。左側のペインでフォルダーを選択すると、右側のペインのテーブル・ビューアーにそのフォルダーに格納されているファイルが表示されます。右側のペインの項目をソートしてフォルダーが最初に表示されるようにしています。どちらのビューアーでも、アイコンを使用してファイルとフォルダーを表しています。

ウィンドウにシンプルなバー・メニューを追加してみます。


メニュー

JFaceMenuManager を使用するとSWTメニューを簡単に作成および更新できます。メニュー・マネージャーには、項目、ほかのメニュー・マネージャー (サブメニュー用)、およびセパレーターを含めることができます。メニュー・マネージャーを作成すると、それをバー・メニュー、コンテキスト・メニュー (ポップアップ・メニューとも呼ぶ)、またはツールバー・ドロップダウン・メニューのいずれかで表すことができます。

ビューアーの場合と同様に、メニュー・マネージャーはラッパー・オブジェクトというより、ヘルパー・オブジェクトです。ただし、一般的にSWTメニュー自体にアクセスする必要はありません。メニューについて説明する前に、メニュー・マネージャーに何を設定できるかを見てみましょう。

アクション

メニュー・マネージャーにアクションを追加します。実際は、ボタンおよびツールバーにもアクションを追加できます。目的は、アクションをサブクラス化し、メニュー、ツールバー、およびボタンに表示するテキストを設定し、run() メソッドを実装して目的の操作を実行することです。

リスト1のサンプルExitActionを見てください。

リスト1. ExitAction (バージョン1)
import org.eclipse.jface.action.*;
import org.eclipse.jface.window.*;
public class ExitAction extends Action
{
ApplicationWindow window;

public ExitAction(ApplicationWindow w)
{
window = w;
setText("E&xit");
}
public void run()
{
window.close();
}
}

これは、実にシンプルです。Exitのx の前の& 文字は、x がこのメニュー項目のキーボード・ナビゲーション・キー (ニーモニック) であることを示しています。これは、キー・アクセラレーター (ホット・キー) とは異なることに注意してください。これについては、後で説明します。

アクションのサブクラス化

Action がメソッドgetText() を定義するという点を誤解しないようにしてください。それをオーバーライドするということではありません。 代わりに、setText(String) を使用し、Actionがそれを格納し、現在このアクションを使用しているすべてのSWTコントロールが新しいテキストで更新されるようにすることを意味します。
これは、ツール・ヒント・テキストやその有効な状態などほかのすべてのActionプロパティーに当てはまります。これについては、後で説明します。

アプリケーション・ウィンドウへのバー・メニューの追加

ApplicationWindowで次のメソッドを使用して、バー・メニューを持つようにアプリケーション・ウィンドウを構成する必要があります。

protected void addMenuBar()

SWTシェルを作成する前にこの構成を実行する必要があることを忘れないでください。これによって、アプリケーション・ウィンドウ・メソッドcreateMenuManager() が呼び出され、この呼び出しの結果、あとでSWT Bar Menuの作成に使用するメニュー・マネージャーが返されます。リスト2はこの実装を示しています。

リスト2. Explorer - createMenuManager
protected MenuManager createMenuManager()
{
MenuManager bar_menu = new MenuManager("");
MenuManager file_menu = new MenuManager("&File");
MenuManager edit_menu = new MenuManager("&Edit");
MenuManager view_menu = new MenuManager("&View");
bar_menu.add(file_menu);
bar_menu.add(edit_menu);
bar_menu.add(view_menu);
file_menu.add(new ExitAction(this));
return bar_menu;
}

Explorerは図2のようになります。

図2. Explorer (バージョン9)
図2. Explorer (バージョン9)

空のメニューは無効になっている点に注意してください。ナビゲーション・キーALT+Fx を使用してエクスプローラー・アプリケーションを閉じてみてください。

リスト3に示すように終了アクションを少し改善します。

リスト3. ExitAction (バージョン2)
import org.eclipse.jface.action.*;
import org.eclipse.jface.resource.*;
import org.eclipse.jface.window.*;
import org.eclipse.swt.*;
public class ExitAction extends Action
{
  ApplicationWindow window;
  public ExitAction(ApplicationWindow w)
  {
    window = w;
setText("E&xit@Ctrl+W");
    setToolTipText("Exit the application");
    setImageDescriptor(
      ImageDescriptor.createFromURL(Util.newURL("file:icons/close.gif")));
  }
  public void run()
  {
    window.close();
  }
}

アクセラレーター・キー (ホット・キー)、ツール・ヒント、イメージを追加しました (ツール・ヒントはメニュー項目には表示されません。あとで見るように、ツールバー項目上に表示されます)。アクセラレーター・キーを直接設定するメソッドがありますが、@ 文字の後にテキストで指定するほうが簡単です。そのようにすると、図3のようにメニュー項目のテキストにアクセラレーター・キーが表示されるためです。

図3. Explorer (バージョン10)
図3. Explorer (バージョン10)

鋭眼の読者の方は、アクションにイメージ・ディスクリプターを直接指定していることに気が付いたかもしれません。実際の狙いは、イメージ・レジストリーからイメージ・ディスクリプターを取得することです。問題は、イメージ・レジストリーが返すのはImages のみで、それにImageDescriptor を要求できないことです。これは、Eclipseバグ・データベースのバグ23555 です。

ファイルに関連付けられたプログラムの起動

ファイルに関連付けられたプログラムを実行すると、実に便利です。また、これは、リスト4に示すようにProgram クラスを使用すると、とても簡単に実行できます。

リスト4. OpenAction (バージョン1)
import org.eclipse.jface.action.*;
import org.eclipse.jface.window.*;
public class ExitAction extends Action
{
ApplicationWindow window;

public ExitAction(ApplicationWindow w)
{
window = w;
setText("E&xit");
}
public void run()
{
window.close();
}
}

getTableSelection() (このメソッドは後で説明します) を使用して、選択した要素をテーブル上で捕捉します。次に、選択されている要素が1つのみであることを確認します。テーブルが複数選択スタイルになっていることを忘れないでください。次に、その要素自体を取得し、それがフォルダーではなくファイルであることを確認してから起動します。

プログラムのlaunch() メソッドは、ファイル拡張子に基づいて関連付けられたプログラムを検索するという操作をすべて実行し、次に絶対ファイル名を引数に指定して、適切な実行可能プログラムを実行します。

これを試す前に、最後のアクションについて説明します。

システム・クリップボードの使用

システム・クリップボードのちょっとした上手な使用法を示します。アクションCopyFileNamesToClipboardAction は、選択したすべてのファイルの絶対ファイル名をクリップボードにコピーします。

Clipboard オブジェクトを使用してテキストをシステム・クリップボードに転送します。

リスト5に示すように、まずUtil クラスでとりあえずクリップボード・オブジェクトを作成します。

リスト5. Util (バージョン2)
import java.net.*;
import org.eclipse.jface.resource.*;
import org.eclipse.swt.dnd.*;
import org.eclipse.swt.widgets.*;
public class Util
{
  private static ImageRegistry image_registry;
  private static Clipboard clipboard;
  public static URL newURL(String url_name)
  {
    try
    {
      return new URL(url_name);
    }
    catch (MalformedURLException e)
    {
      throw new RuntimeException("Malformed URL " + url_name, e);
    }
  }
  public static ImageRegistry getImageRegistry()
  {
    if (image_registry == null)
    {
      image_registry = new ImageRegistry();
      image_registry.put(
        "folder",
        ImageDescriptor.createFromURL(newURL("file:icons/folder.gif")));
      image_registry.put(
        "file",
        ImageDescriptor.createFromURL(newURL("file:icons/file.gif")));
    }
    return image_registry;
  }
public static Clipboard getClipboard()
  {
    if (clipboard == null)
    {
      clipboard = new Clipboard(Display.getCurrent());
    }
    return clipboard;
  }
}

テキストをクリップボードに配置するには、Clipboardに対して次のメソッドを使用します。

public void setContents(Object[] data, Transfer[] dataTypes)

データの各配列スロットは、どのようなタイプのデータが含まれているかをクリップボードに伝える転送オブジェクトと関連付けられています。この例では、TextTransfer オブジェクトを使用します。このオブジェクトは、RTFなどではなくプレーン・テキストを転送することをクリップボードに伝えます。

public void setContents(Object[] data, Transfer[] dataTypes) の引数は配列です。したがってデータを一度に複数の形式で転送できます。たとえば、ワード・プロセッシング・アプリケーションではテキストをRTFとプレーン・テキストで転送する必要があることがあります。

リスト6のコードでは、次のことを実行します。

  • 選択した項目を取得します。
  • それが空でないことを確認します。
  • 上記の処理を繰り返し、絶対ファイル名を文字列バッファーに追加します。
  • Text Transferオブジェクトを使用して、この文字列をクリップボードに転送します。
  • この文字列をステータス行に配置し、フィードバックが得られるようにします。
リスト6. CopyFileNamesToClipboardAction (バージョン1)
import java.io.*;
import java.util.*;
import org.eclipse.jface.action.*;
import org.eclipse.jface.resource.*;
import org.eclipse.jface.viewers.*;
import org.eclipse.swt.*;
import org.eclipse.swt.dnd.*;
public class CopyFileNamesToClipboardAction extends Action
{
Explorer window;
public CopyFileNamesToClipboardAction(Explorer w)
{
window = w;
setToolTipText("Copy absolute file names of selected files to the clipboard");
setText("Copy File &Names@Ctrl+Shift+C");
setImageDescriptor(
ImageDescriptor.createFromURL(Util.newURL("file:icons/copy.gif")));
}
public void run()
{
Clipboard clipboard = Util.getClipboard();
TextTransfer text_transfer = TextTransfer.getInstance();
IStructuredSelection selection = window.getTableSelection();
if (selection.isEmpty())
{
return;
}
StringBuffer string_buffer = new StringBuffer();
for (Iterator i = selection.iterator(); i.hasNext();)
{
File file = (File) i.next();
string_buffer.append(" ");
string_buffer.append(file.getAbsolutePath());
}
clipboard.setContents(
new Object[] { string_buffer.toString()},
new Transfer[] { text_transfer });
}
}

最後に、バー・メニューに2つの新しいアクションを追加するコードとともに、getTableSelection() メソッドを追加するための Explorerに対する変更を以下に示します。(リスト7)

リスト7. Explorer (バージョン10)
import java.io.*;
import org.eclipse.jface.action.*;
import org.eclipse.jface.viewers.*;
import org.eclipse.jface.window.*;
import org.eclipse.swt.*;
import org.eclipse.swt.custom.*;
import org.eclipse.swt.widgets.*;
public class Explorer extends ApplicationWindow
{
private TableViewer tbv;
...
public static void main(String[] args)
{
Explorer w = new Explorer();
w.setBlockOnOpen(true);
w.open();
Display.getCurrent().dispose();
Util.getClipboard().dispose();
}
protected MenuManager createMenuManager()
{
MenuManager bar_menu = new MenuManager("");
MenuManager file_menu = new MenuManager("&File");
MenuManager edit_menu = new MenuManager("&Edit");
MenuManager view_menu = new MenuManager("&View");
bar_menu.add(file_menu);
bar_menu.add(edit_menu);
bar_menu.add(view_menu);
file_menu.add(new ExitAction(this));
edit_menu.add(new CopyFileNamesToClipboardAction(this));
edit_menu.add(new OpenAction(this));
return bar_menu;
}
public IStructuredSelection getTableSelection()
{
return (IStructuredSelection) (tbv.getSelection());
}
}

Explorerのインスタンスの図

現在3つのアクションと8つのその他のクラスがあります。Explorerのインスタンスの図 (図4) を見てみましょう (実装したクラスはダークグレーで表示してあります)。

図4. Explorer (バージョン10) とそれに関連付けられたオブジェクト
図4. Explorer (バージョン10) とそれに関連付けられたオブジェクト

このバージョンを実行し、アクションを見てみます (図5)

図5. Explorer (バージョン10)
図5. Explorer (バージョン10)

GUIインスタンスの階層を簡潔にする

私の経験では、GUIオブジェクトの設計では、構築したインスタンス階層がかなり大きくなってしまう傾向があります。異なる階層にある下位レベルのオブジェクトは、お互いを認識する必要があるため、特別な相互参照を作成したくなりますが、それによってコードが複雑になる可能性があります。

ここに示す小規模の例でも、それが起こりつつあります。アクション・オブジェクトは、テーブル・ビューアーで現在選択されている項目を認識する必要があります。問題は、アクションがどのオブジェクトを格納するかです。テーブル・ビューアーでしょうか、SWTテーブル自体でしょうか、Windowでしょうか。

図6. Window、ウィジェット、およびアクション
図6. Window、ウィジェット、およびアクション

ソリューションの1つは、ウィンドウを介して、すべてのアクセスをウィジェットまたは選択オブジェクトに集中させることです。各アクションに、それを作成したウィンドウを格納すると、その後、そのウィンドウのアクセサー・メソッドを使用して必要なオブジェクトを取得できるようになります。

さまざまなメソッド名を使用してウィジェットへのアクセスが発生するウィンドウ間でアクションを共有する場合は、メソッド内でアクションからウィジェットへのアクセスをラップできます。これをアクションのサブクラスに実装し直して、適切なウィジェットを取り出すことができます。

たとえば、選択した項目にアクセスする必要があるアクションを共有するには、サブクラスのメソッドgetSelection() を次のように実装します。

window.getTableSelection()

を1つのサブクラスで実装し、

window.getThirdListViewerSelection()

を別のサブクラスで実装します。

アクションをコンテキスト・センシティブにする

アクションについて可能なもう1つの処理として、ウィンドウのその他の部分で何が起きているかをアクションに認識させ、それに適応させるというものがあります。テーブル・ビューアーでの現在の選択に対する変更をOpenAction がリッスンするようにします。それが変更を認識すると、新しい選択を調べ、それを反映するようにテキスト、ツール・ヒント、および有効な状態を変更します。

OpenAction は、現在選択されているファイルに「関連付けられた」プログラムを起動します。何も選択されていない場合は、実行してエラーを報告するより、何も処理せずにアクションを無効にするようにします。

ユーザーにとって使いやすいものにするという面から言えば、無効になったメニュー項目を見てなぜそれが無効なのかを理解できないと混乱します。そこで、ツール・ヒントを変更し、ユーザーにアクションが無効になっている理由を伝えるようにすることを考えました。

複数のファイルが選択されている場合の処理方法も決めておく必要があります。それらのファイルを順にすべて実行することもできます。しかし、私には、300個のファイルを選択してWindowsエクスプローラから「開く」オプションを選択した苦い経験があるので、ここではこの方法は採用しないことにします。

最後に、選択した項目がフォルダーであるかどうかを調べ、フォルダーであった場合も、ファイルを開くアクションを無効にします。

OpenAction を、テーブル・ビューアーから発生するSelectionChangedイベントのリスナーにする必要があります。そのために、ISelectionChangedListenerを実装します (リスト8)。

以下のことをselectionChanged() で実行します。

  • テキストとツール・ヒント・テキストをデフォルトに設定します。
  • 選択内容を調べます。
  • 選択されている項目が1つだけでない場合は、アクションを無効にし、無効になっている理由を表示するようにツール・ヒントを調整して、返します。
  • フォルダーではなくファイルが選択されている場合は、ファイル名を反映させてテキストとツール・ヒントを調整し、それを有効にします。
リスト8. OpenAction (バージョン2)
import java.io.*;
import org.eclipse.jface.action.*;
import org.eclipse.jface.resource.*;
import org.eclipse.jface.viewers.*;
import org.eclipse.swt.program.*;
public class OpenAction
extends Action
implements ISelectionChangedListener
{
Explorer window;
public OpenAction(Explorer w)
{
window = w;
setText("Run");
setToolTipText("Run the associated program on a file");
setImageDescriptor(
ImageDescriptor.createFromURL(Util.newURL("file:icons/run.gif")));
}
public void run()
{
IStructuredSelection selection = window.getTableSelection();
if (selection.size() != 1)
{
return;
}
File selected_file = (File) selection.getFirstElement();
if (selected_file.isFile())
{
Program.launch(selected_file.getAbsolutePath());
}
}
public void selectionChanged(SelectionChangedEvent event)
{
setText("Run");
setToolTipText("Run the associated program on a file");
IStructuredSelection selection = window.getTableSelection();
if (selection.size() != 1)
{
setEnabled(false);
setToolTipText(
getToolTipText() + " (Only enabled when exactly one item is selected)");
return;
}
File file = (File) selection.getFirstElement();
if (file.isFile())
{
setEnabled(true);
setText("Run the associated program on " + file.getName());
setToolTipText(
"Run the program associated with "
+ file.getName()
+ " with this file as the argument");
}
}
}

ここで、SelectionChangedイベントが発生していないか、オープン・アクションでテーブル・ビューアーをリッスンするようにします (リスト9)。

リスト9. Explorer (バージョン11) - 変更されていない一部のコードは省略
...
public class Explorer extends ApplicationWindow
{
private TableViewer tbv;
private OpenAction open_action;
...
protected Control createContents(Composite parent)
{
...
tbv.addSelectionChangedListener(open_action);
return sash_form;
}
...
protected MenuManager createMenuManager()
{
MenuManager bar_menu = new MenuManager("");
MenuManager file_menu = new MenuManager("&File");
MenuManager edit_menu = new MenuManager("&Edit");
MenuManager view_menu = new MenuManager("&View");
bar_menu.add(file_menu);
bar_menu.add(edit_menu);
bar_menu.add(view_menu);
file_menu.add(new ExitAction(this));
edit_menu.add(new CopyFileNamesToClipboardAction(this));
open_action = new OpenAction(this);
edit_menu.add(open_action);
return bar_menu;
}
...
}
図7. Explorer (バージョン11) - ファイルが1つ選択された場合のEditメニュー
図7. Explorer (バージョン11) - ファイルが1つ選択された場合のEditメニュー

選択されているファイルの数によってオープン・アクションがどのように変わるかを見てみます (図8)。

図8. Explorer (バージョン11) - ファイルが選択されていない場合のEditメニュー
図8. Explorer (バージョン11) - ファイルが選択されていない場合のEditメニュー

ツールバーとポップアップ・メニュー

最後に、ツールバーとポップアップ (コンテキスト) メニューを追加します。幸運なことに、面倒な作業はアクションで処理してしまったので、ここではあまり作業はありません。ツールバーとポップアップ・メニューでは、アクションを共有するだけです。

ステータス行やバー・メニューと同様に、ウィンドウがツールバーを持つように構成し、createToolBarManager() メソッドを実装してそのツールバーを作成します。

これは、ポップアップ・メニューの場合は少し異なります。ポップアップ・メニューの場合はcreateContents() メソッドで作成し、それを直接テーブル・ウィジェットに追加します。

3つのアクションすべてをローカル変数ではなくフィールドとして持つようにコードをリファクタリングし、それらに3つのメソッドからアクセスできるようにします。Explorerの最終バージョンは次のようになります (リスト10)。

リスト10. Explorer (バージョン12)
import java.io.*;
import org.eclipse.jface.action.*;
import org.eclipse.jface.viewers.*;
import org.eclipse.jface.window.*;
import org.eclipse.swt.*;
import org.eclipse.swt.custom.*;
import org.eclipse.swt.widgets.*;
public class Explorer extends ApplicationWindow
{
private TableViewer tbv;
private TreeViewer tv;
private OpenAction open_action;
private ExitAction exit_action;
private CopyFileNamesToClipboardAction copy_action;
public Explorer()
{
super(null);
exit_action = new ExitAction(this);
copy_action = new CopyFileNamesToClipboardAction(this);
open_action = new OpenAction(this);
addStatusLine();
addMenuBar();
addToolBar(SWT.FLAT | SWT.WRAP);
}
protected Control createContents(Composite parent)
{
getShell().setText("JFace File Explorer");
SashForm sash_form = new SashForm(parent, SWT.HORIZONTAL | SWT.NULL);
tv = new TreeViewer(sash_form);
tv.setContentProvider(new FileTreeContentProvider());
tv.setLabelProvider(new FileTreeLabelProvider());
tv.setInput(new File("C://"));
tv.addFilter(new AllowOnlyFoldersFilter());
tbv =
new TableViewer(sash_form, SWT.BORDER| SWT.FULL_SELECTION | SWT.MULTI);
tbv.setContentProvider(new FileTableContentProvider());
tbv.setLabelProvider(new FileTableLabelProvider());
tbv.setSorter(new FileSorter());
TableColumn column = new TableColumn(tbv.getTable(), SWT.LEFT);
column.setText("Name");
column.setWidth(200);

column = new TableColumn(tbv.getTable(), SWT.RIGHT);
column.setText("Size");
column.setWidth(100);
tbv.getTable().setHeaderVisible(true);
tv.addSelectionChangedListener(new ISelectionChangedListener()
{
public void selectionChanged(SelectionChangedEvent event)
{
IStructuredSelection selection =
(IStructuredSelection) event.getSelection();
Object selected_file = selection.getFirstElement();
tbv.setInput(selected_file);
}
});
tbv.addSelectionChangedListener(new ISelectionChangedListener()
{
public void selectionChanged(SelectionChangedEvent event)
{
IStructuredSelection selection =
(IStructuredSelection) event.getSelection();
setStatus("Number of items selected is " + selection.size());
}
});
tbv.addSelectionChangedListener(open_action);
MenuManager menu_manager = new MenuManager();
tbv.getTable().setMenu(menu_manager.createContextMenu(tbv.getTable()));
menu_manager.add(exit_action);
menu_manager.add(copy_action);
menu_manager.add(open_action);
return sash_form;
}
public static void main(String[] args)
{
Explorer w = new Explorer();
w.setBlockOnOpen(true);
w.open();
Display.getCurrent().dispose();
Util.getClipboard().dispose();
}
protected MenuManager createMenuManager()
{
MenuManager bar_menu = new MenuManager("");
MenuManager file_menu = new MenuManager("&File");
MenuManager edit_menu = new MenuManager("&Edit");
MenuManager view_menu = new MenuManager("&View");
bar_menu.add(file_menu);
bar_menu.add(edit_menu);
bar_menu.add(view_menu);
file_menu.add(exit_action);
edit_menu.add(copy_action);
edit_menu.add(open_action);
return bar_menu;
}
public IStructuredSelection getTableSelection()
{
return (IStructuredSelection) (tbv.getSelection());
}
public void openFolder(File folder)

{
tv.setExpandedState(folder, true);
tv.setSelection(new StructuredSelection(folder), false);
}

protected ToolBarManager createToolBarManager(int style)
{
ToolBarManager tool_bar_manager = new ToolBarManager(style);
tool_bar_manager.add(exit_action);
tool_bar_manager.add(copy_action);
tool_bar_manager.add(open_action);
return tool_bar_manager;
}
}

ここで、最後に、Explorerを起動して、ツールバーとポップアップ・メニューがどのように表示されるか見てみましょう (図9と10)。

図9. Explorer (バージョン12) - ファイルが1つ選択された場合のポップアップ・メニュー
図9. Explorer (バージョン12) - ファイルが1つ選択された場合のポップアップ・メニュー
図10. Explorer (バージョン12) - ファイルが2つ選択された場合のツール・ヒント
図10. Explorer (バージョン12) - ファイルが2つ選択された場合のツール・ヒント

まとめ

この3回シリーズの記事でJFaceについてかなり多くのことを取り上げました。組み込み可能なJFaceウィンドウ、ビューアー、およびメニュー・フレームワークで、どのようにして小型のコードで見栄えの良いユーザー・インターフェースを作成するか説明してきました。

ここで学んだのは次のようなことです。

  • アプリケーション・ウィンドウをサブクラス化する方法
  • 組み込み可能なビューアーとコンテンツ・プロバイダーの使用方法
  • イメージとイメージ・レジストリーを使用したアイコンの追加方法
  • システム・クリップボードの使用方法
  • プログラムの起動方法
  • メニューとアクションの使用方法
  • さまざまなメニュー・コンテナーとリスナーでアクションを機能させて、コンテキスト・センシティブなアプリケーションを作成する方法

もちろん、ほかにも習得しておくと役に立つ項目はあります。詳細については、参考文献を参照してください。

参考文献

コメント

developerWorks: サイン・イン

必須フィールドは(*)で示されます。


IBM ID が必要ですか?
IBM IDをお忘れですか?


パスワードをお忘れですか?
パスワードの変更

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


お客様が developerWorks に初めてサインインすると、お客様のプロフィールが作成されます。会社名を非表示とする選択を行わない限り、プロフィール内の情報(名前、国/地域や会社名)は公開され、投稿するコンテンツと一緒に表示されますが、いつでもこれらの情報を更新できます。

送信されたすべての情報は安全です。

ディスプレイ・ネームを選択してください



developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

必須フィールドは(*)で示されます。

3文字から31文字の範囲で指定し

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


送信されたすべての情報は安全です。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Open source, Java technology
ArticleID=236394
ArticleTitle=Eclipse Workbench以外でのEclipse GUIの使用 第3回: アクション、メニュー、およびツールバーを追加する
publish-date=03042003