本文へジャンプ

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


お客様が developerWorks に初めてサインインすると、プロフィールが作成されます。プロフィールで選択した情報は公開されますが、いつでもその情報を編集できます。お客様の姓名(非表示設定にしていない限り)とディスプレイ・ネームは、投稿するコンテンツと一緒に表示されます。

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

  • 閉じる [x]

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

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

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


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

  • 閉じる [x]

SWTとJFace 第2回: やさしい紹介

メニュー、リスト、コンボ、テーブル、ツリーを見る

Barry Feigenbaum, Ph.D., Programming Advisor, IBM
Barry Feigenbaum博士は、IBMアクセシビリティ・センターのメンバーです。そこで彼は、IBM製品を障害者にとってアクセシブルなものにするための作業を行うチームに属しています。Feigenbaum博士は、本や記事をいくつか出版しており、いくつかの特許を取り、JavaOneなどの業界で開催される会議で講演したことがあります。彼は、オースティンのテキサス大学で情報科学の非常勤助教授を務めています。

概要: SWTとJFaceシリーズの第2回は、第1回で学んだこと、つまりJava™技術やEclipse、SWT、JFaceライブラリーなどを使って単純なSWT(Standard Widget Toolkit)アプリケーションを作る方法を、さらに拡張します。今回は、コンボやリスト、テーブル、ツリーなどのコントロール、そしてフォーム・レイアウトや再利用可能なヘルパー・メソッドの使い方などを解説します。

日付:  2005年 7月 19日
レベル:  中級 この記事の原文:  英語
アクティビティー: 2351 ビュー
お気軽にご意見・ご感想をお寄せください: 


プログラマーはSWT(Standard Widget Toolkit)やJFaceライブラリーを使って、Eclipse環境用のGUI(graphical user interface)や、スタンドアローンのGUIネイティブ・アプリケーションを開発します。

このシリーズの第1回では、EclipseやEclipse SWT、そしてJFace GUIツールキットを使って、Eclipse用のGUIや、表現力豊かなスタンドアローンのGUIを構築する方法を紹介しました。また、基本的なGUIコントロールとして、ラベルやテキスト、ボタンなどを説明し、そしてコンポジットやグループ、シェル・コンテナーなどのタイプについても解説しました。そして最後に、こうしたコントロールを組み合わせ、実際に動作する単純なアプリケーションを作りました。

今回は、アプリケーションにメニューを追加する方法や、リスト入力コントロールの使い方、そして、さらに高度な、テーブルやツリーなどのコンテナー・コントロールの使い方などについて学びます。また、簡単にGUIを構築するためにサービス・メソッドを使う、ベスト・プラクティスについても説明します。最後に、再利用可能なファンクションを抽出して、ベース・アプリケーション・クラスにする方法についても解説します。

特に注記が無い限り、ここで取り上げるウィジェットやコントロールは、org.eclipse.swt.widgetsパッケージの中に含まれています。

メニュー

GUIアプリケーションでは、最も原始的なものを除いて、メニューを必要とします。メニューによって、どんなGUIでも使い方を拡張することができます。メニューというのは動的に表示される選択リストであり、使用可能なファンクション(通常はコマンドと呼ばれます)、あるいはGUIが宣言するファンクションに対応します。皆さんが想像される通り、メニューを作るには、メニュー・ウィジェットを使います。メニューは、他のメニューや、menuItemを含むことができます(menuItemは、メニュー、つまりメニューの階層構造を含むことができます)。またmenuItemは、実行できるコマンドや、選択したGUI状態を表します。メニューは、アプリケーションの(つまりシェルの)メニュー・バーに関連付けることもできれば、アプリケーション・ウィンドウ上の自由な位置に配置できるポップ・アップ・メニューとすることもできます。

メニューには、次のように相互排他的な3つのスタイルのうち、どれか1つのスタイルを定義する必要があります。

  1. BARは、シェルに対するメニュー・バーとして動作します。
  2. DROP_DOWNは、メニュー・バー、あるいはメニュー・アイテムから『垂れ下がり』ます。
  3. POP_UPは、シェルからポップ・アップしますが、特定なコンテキストの制御に依存して動作します。

またメニューは、オプションとして次のようなスタイルもサポートします。

  • NO_RADIO_GROUPは、ラジオ・グループとしては動作しません。メニューが、RADIOスタイルのアイテムを含む場合に、このスタイルを使います。
  • LEFT_TO_RIGHTあるいはRIGHT_TO_LEFTは、テキストの方向を選択します。

menuItemには、次のように相互排他的な5つのスタイルのうち、どれか1つのスタイルを定義する必要があります。

  1. CHECKは、常に選択されています(つまりチェックされた状態にあります)。
  2. CASCADEは、ドロップ・ダウンすべきメニューを含んでいます。
  3. PUSHは、瞬時に動作させるためのボタンとして動作します。
  4. RADIOは、CHECKと同じように動作しますが、(このタイプを持つ)1つのアイテムだけが選択されます。
  5. SEPARATORは、アイテム・グループ間を隔てるセパレーター(通常は縦線です)として動作し、機能は何も持っていません。

メニュー・システムの構築は非常に複雑です。リスト1は、実際に動作するメニュー・システムを構築するためのコードの例です。


リスト1. メニュー・システムとポップ・アップ・メニューを作る
                
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.*;
import org.eclipse.swt.events.*;
import org.eclipse.swt.graphics.*;
  :
Shell shell = ...;
  :
Label body = ...;
  :
// Create the menu bar system
Menu main = createMenu(shell, SWT.BAR | SWT.LEFT_TO_RIGHT);
shell.setMenuBar(main);

MenuItem fileMenuItem = createMenuItem(main, SWT.CASCADE, "&File", 
                                       null, -1, true, null);
Menu fileMenu = createMenu(shell, SWT.DROP_DOWN, fileMenuItem, true);
MenuItem exitMenuItem = createMenuItem(fileMenu, SWT.PUSH, "E&xit\tCtrl+X", 
                                       null, SWT.CTRL + 'X', true, "doExit");

MenuItem helpMenuItem = createMenuItem(main, SWT.CASCADE, "&Help", 
                                       null, -1, true, null);
Menu helpMenu = createMenu(shell, SWT.DROP_DOWN, helpMenuItem, true);
MenuItem aboutMenuItem = createMenuItem(helpMenu, SWT.PUSH, "&About\tCtrl+A", 
                                        null, SWT.CTRL + 'A', true, "doAbout");

// add popup menu
Menu popup = createPopupMenu(shell, body);
MenuItem popupMenuItem1 = createMenuItem(popup, SWT.PUSH, "&About", 
                                         null, -1, true, "doAbout");
MenuItem popupMenuItem2 = createMenuItem(popup, SWT.PUSH, "&Noop", 
                                         null, -1, true, "doNothing");

このコード・シーケンスは、サブ・メニューとポップアップ・メニューを持った、次のようなメニュー・バーを作ります(図1図2図3図4を参照)。bodyの値は、テキスト「Sample body」を持つ、ラベル・コントロールです。ポップアップ・メニューは、このコントロールと、コンテキスト的に関連付けられています。

このシリーズについて

このシリーズ、SWTとJFaceでは、ベースとなるEclipseのSDK(software development kit)に付属するSWTとJFaceライブラリーを使ったアプリケーションの開発を解説します。このシリーズでは、スタンドアローンのアプリケーションに対してSWTとJFaceを使う場合に限定しますが、ここで学ぶものの大部分は、Eclipseワークベンチで使う場合にも応用することができます。

最初は、限定機能のGUIから始め、次第に、使い道の広いアプリケーションに進みます。標準的、あるいはカスタムのSWTウィジェットと共に、JFace機能の多くについても紹介します。議論の中では、これらの技術の使用例を、少なくとも1つは含むようにします。

このシリーズは、Java言語やJavaベースの開発に慣れており、またJava AWTやSwing GUIツールキットを、ある程度理解している人を対象にしています。


図1. FileとHelpを持つメニュー・バー
図1. FileとHelpを持つメニュー・バー


図2. Fileメニューのドロップ・ダウン
図2. Fileメニューのドロップ・ダウン


図3. Helpメニューのドロップ・ダウン
図3. Helpメニューのドロップ・ダウン


図4. ポップアップ・メニュー
図4. ポップアップ・メニュー

これを見ると分かると思いますが、ユーザーがキーボードからアイテムを選択できるように、メニュー・アイテムにアクセラレーター(Ctrl+?)や、簡略記号(mnemonic、つまり&で識別される、下線付きの文字)を使うことができます。

私は、これらのメニュー・アイテムを、リスト2に示す一連のヘルパー・メソッドを使って作りました。メニューのような、繰り返しの多いGUIパーツを作る場合のベスト・プラクティスとしては、このようなメソッドを作ることです。こうしたヘルパー・メソッドにサポート・ファンクションを追加して行くと、やがて、あらゆる場合に使えるものになります。また、必要な値を、こうしたメソッドが知らせてくれるようになります。


リスト2. メニューを作るためのヘルパー・ルーチン
                
protected Menu createMenu(Menu parent, boolean enabled) {
    Menu m = new Menu(parent);
    m.setEnabled(enabled);
    return m;
}
protected Menu createMenu(MenuItem parent, boolean enabled) {
    Menu m = new Menu(parent);
    m.setEnabled(enabled);
    return m;
}
protected Menu createMenu(Shell parent, int style) {
    Menu m = new Menu(parent, style);
    return m;
}
protected Menu createMenu(Shell parent, int style, 
                          MenuItem container, boolean enabled) {
    Menu m = createMenu(parent, style);
    m.setEnabled(enabled);
    container.setMenu(m);
    return m;
}
protected Menu createPopupMenu(Shell shell) {
    Menu m = new Menu(shell, SWT.POP_UP);
    shell.setMenu(m);
    return m;
}
protected Menu createPopupMenu(Shell shell, Control owner) {
    Menu m = createPopupMenu(shell);
    owner.setMenu(m);
    return m;
}
protected MenuItem createMenuItem(Menu parent, int style, String text, 
                                  Image icon, int accel, boolean enabled, 
                                  String callback) {
    MenuItem mi = new MenuItem(parent, style);
    if (text != null) {
        mi.setText(text);
    }
    if (icon != null) {
        mi.setImage(icon);
    }
    if (accel != -1) {
        mi.setAccelerator(accel);
    }
    mi.setEnabled(enabled);
    if (callback != null) {
        registerCallback(mi, this, callback);
    }
    return mi;
}

リスト3は、メニュー・アイテムと、それらを処理するコードとをリンクするために、Javaのリフレクション(reflection)機能を使う方法を示しています。この機能を使うと、単純にpublicメソッド(例えばdoExitやdoAbout、あるいはdoNothing)をアプリケーション・クラスに追加すればコマンド処理ができるような、使いやすいメソッドを作ることができるのです。


リスト3. メニュー・コマンドを処理するためのコールバック・ルーチン
                
protected void registerCallback(final MenuItem mi, 
                                final Object handler, 
                                final String handlerName) {
    mi.addSelectionListener(new SelectionAdapter() {
        public void widgetSelected(SelectionEvent e) {
            try {
                Method m = handler.getClass().getMethod(handlerName, null);
                m.invoke(handler, null);
            }
            catch (Exception ex) {
                ex.printStackTrace();
            }
        }
    });
}

SelectionListenerの使い方の詳細については、このシリーズの第1回で説明しました。

ここで注意して欲しいのですが、メニューのアイテムは(そして後で取り上げる、リストやコンボ、テーブル、ツリー・コントロールの中のアイテムも)、ストリング値しかサポートしません。他のタイプを追加する場合には、追加する前にストリング値に変換する必要があります。



コンボとリスト

GUIの設計では、事前に決められた値のリストからユーザーが選択できるようにしたいことが頻繁にあります。リスト・コントロールは、それを実現するために一番簡単な方法です。リストは事前に決められた一連のストリング値を示し、ユーザーは、ここから値を選択するのです。リストは通常、大量の画面スペースを必要とします。スペースを節約したい場合にコンボ・コントロールを使うと、必要な場合にだけ、リストをドロップダウンできるようになります。またコンボを使うと、ユーザーが、テキスト風のフィールドに望みの値を入れることもできるようになります。

コンボには、次のように相互排他的な2つのスタイルのうち、どちらか1つのスタイルを定義する必要があります。

  1. SIMPLEは、値のリストを表示します。
  2. DROP_DOWNは、値のリストをドロップダウンで表示します。

コンボはオプションとして、次のスタイルもサポートしています。

  • READ_ONLYは、このコンボのテキスト・フィールドを、ユーザーが編集できないようにします。

ここで取り上げるコントロール(リスト、コンボ、テーブル、ツリー)はすべて、次のように相互排他的な2つのスタイルのうち、どちらか1つをサポートします。

  1. SINGLEユーザーは、1つのアイテムしか選択できません。
  2. MULTIユーザーは、複数のアイテムを選択することができます。

これらのコントロールは、さらに次のようなスタイルもサポートしています。

  • H_SCROLLは、必要な場合に横方向のスクロール・バーを表示します。
  • V_SCROLLは、必要な場合に縦方向のスクロール・バーを表示します。

コンボやリストを作るのは非常に単純です。コントロールの作成と、必要なストリング値の追加を、リスト4に示します。


リスト4. FormLayoutを使って、コンボとリストを作る
                

import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.*;
import org.eclipse.swt.events.*;
import org.eclipse.swt.layout.*;
  :
setLayout(new FormLayout());

String[] data = { "Item 1", "Item 2", "Item 3", "Item 4", "Item 5",
                  "Item 6", "Item 7", "Item 8", "Item 9", "Item 10" };

Combo c = createCombo(this, data);
configureLayout(c, new FormAttachment(0, 5), new FormAttachment(0, 5), 
                   new FormAttachment(100, -5), null);

List l = createList(this, data);
configureLayout(l, new FormAttachment(0, 5), new FormAttachment(c, 5), 
                   new FormAttachment(100, -5), new FormAttachment(100, -5));

// Create a Combo
protected Combo createCombo(Composite parent, String[] data) {
    Combo combo = new Combo(parent, 
                            SWT.DROP_DOWN | SWT.MULTI | 
                            SWT.V_SCROLL | SWT.H_SCROLL);
    combo.addSelectionListener(new SelectionListener() {
        :
    });
    setComboContents(data);


    return combo;
}
// Create a List
protected List createList(Composite parent, String[] data) {
    List list = new List(parent, SWT.MULTI | 
                         SWT.V_SCROLL | SWT.H_SCROLL);
    list.addSelectionListener(new SelectionListener() {
        :
    });
    setListContents(data);

    return list;
}

public void setComboContents(String[] data) {
    combo.removeAll();
    for (int i = 0; i < data.length; i++) {
        combo.add(data[i]);
    }
}
public void setListContents(String[] data) {
    list.removeAll();
    for (int i = 0; i < data.length; i++) {
        list.add(data[i]);
    }
}

SelectionListenerを追加すると、ユーザーが選択アイテムを変更した場合に、アプリケーションが何らかのアクションを取るようにすることができます。

リスト4はメインのコード・シーケンスを示していますが、このコードが、thisによって参照されるコンポジットの中に含まれていることを想定しています。このコードで、図5に示すような、コンボと(部分的に隠れている)リストが作られます。


図5. コンボとリストの例
図5. コンボとリストの例

コンボ・コントロールの代わりに、CCombo(org.eclipse.swt.customパッケージの中にあります)と呼ばれる実装を使うこともできます。CComboはComboと似ていますが、他のファンクションも幾つかサポートしています。最も顕著なものとして、CComboに組み込みのTextコントロールからテキストをカット、コピーしたり、Textコントロールにペーストしたりするように、プログラム的に指示できるファンクションがあります。また、CComboは常にDROP_DOWNスタイルなので、typeスタイルはサポートしていません。

CComboも、オプションとして次のようなスタイルをサポートしています。

  • BORDERは、テキスト領域の周囲に枠を表示します。
  • READ_ONLYは、このコンボのテキスト・フィールドを、ユーザーが編集できないようにします。

FormLayout

リスト4の例では、FormLayoutを使って、コンボとリストを配置しています。FormLayoutを使うと、他のコントロールとの相対的な位置を指定して各コントロールを配置できます。ですからFormLayoutは、非常に使いやすいレイアウト・マネージャーと言うことができます。FormLayoutを使うと、コントロールの任意の側面(左、上、右、下)を、別のコントロール側面、あるいはコンテナーの(相対する)側面に付加することができます。別のコントロールに接していない側は、そのコントロールに対応した自然な大きさになります。基準とするコントロールの指定、あるいは、コンテナー・サイズの何パーセントを接続ポイントとするか、またそのポイントからのオフセット・ピクセル数の指定には、FormAttachmentのインスタンスを使います。リスト4のコードは、リスト5のヘルパー・メソッドを使っています。


リスト5. configureLayout: FormLayoutのヘルパー・メソッド
                
protected static void configureLayout(Control c, 
                                      FormAttachment left, 
                                      FormAttachment top, 
                                      FormAttachment right, 
                                      FormAttachment bottom) {
    FormData fd = new FormData();
    if (left != null) {
        fd.left = left;
    }
    if (top != null) {
        fd.top = top;
    }
    if (right != null) {
        fd.right = right;
    }
    if (bottom != null) {
        fd.bottom = bottom;
    }
    c.setLayoutData(fd);
}


テーブル

テーブルというのは、リストの機能を強化したもので、TableColumnsをサポートします。TableColumnsは、データの位置を調整して、読みやすい形式にします。また、カラム名や、カラムのサイズ調整機能もサポートしています。テーブルを作るには、まずテーブル・コントロールを作り、テーブル・カラムを追加し、そしてTableItemsで囲んだストリング・データを追加します。

テーブルは、次のようなオプション・スタイルもサポートしています。

  • CHECKは、最初のカラムにチェック・ボックスを追加します。
  • VIRTUALは、(プラットフォーム特有の)大規模なテーブルをサポートします。
  • FULL_SELECTIONは、(最初のカラムだけではなく)全てのカラムを選択します。

リスト6は、図6に示すテーブルを作ります。


リスト6. ヘルパー・メソッドを使ってテーブルを作る
                
// Create the Table and TableColumns 
protected Table createTable(Composite parent, int mode, Object[] contents) {
    table = new Table(parent, mode | SWT.SINGLE | SWT.FULL_SELECTION | 
                      SWT.V_SCROLL | SWT.H_SCROLL);
    table.setHeaderVisible(true);
    table.setLinesVisible(true);

    createTableColumn(table, SWT.LEFT,   "Column 1", 100);
    createTableColumn(table, SWT.CENTER, "Column 2", 100);
    createTableColumn(table, SWT.RIGHT,  "Column 3", 100);

    addTableContents(contents);
    return table;
}
protected TableColumn createTableColumn(Table table, int style, String title, int width) {
    TableColumn tc = new TableColumn(table, style);
    tc.setText(title);
    tc.setResizable(true);
    tc.setWidth(width);
    return tc;
}
protected void addTableContents(Object[] items) {
    for (int i = 0; i < items.length; i++) {
        String[] item = (String[])items[i];
        TableItem ti = new TableItem(table, SWT.NONE);
        ti.setText(item);
    }
}
  :
// sample creation code
protected void initGui() {
    Object[] items = {
        new String[] {"A", "a", "0"}, new String[] {"B", "b", "1"},
        new String[] {"C", "c", "2"}, new String[] {"D", "d", "3"},
        new String[] {"E", "e", "4"}, new String[] {"F", "f", "5"},
        new String[] {"G", "g", "6"}, new String[] {"H", "h", "7"},
        new String[] {"I", "i", "8"}, new String[] {"J", "j", "9"}
    };
    table = createTable(this, SWT.CHECK, items);
}



図6. テーブルの例
図6. テーブルの例

最初のカラムにあるチェック・ボックスはオプションです。各カラムでのデータの配置に注意してください。



ツリー

ツリーは、階層情報を表示できるリストです。ツリーは、アプリケーションが持っている、階層構造の中間レベルを拡大、縮小できる機能をサポートしています。

ツリーは通常、階層構造を表示するので、ツリーにはデータ・モデルを提供する必要があります(このモデルの概念に関しては、後でJFaceを説明する時に改めて触れることにします)。この例では、内部クラスNodeを使っています。これをリスト7に示します。


リスト7. ツリー・モデル・クラスのnode
                

public class Node {
    protected java.util.List children;
    public java.util.List getChildren() {
        return children;
    }
    public void setChildren(java.util.List children) {
        this.children = children;
    }
    public void addChild(Node node) {
        children.add(node);
    }

    protected String name;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }

    public Node(String name) {
        this(name, new ArrayList());
    }
    public Node(String name, java.util.List children) {
        setName(name);
        setChildren(children);
    }
}

ツリーを作るには、まずツリー・コントロールを作り、次にTreeItemsで囲んだストリング・データを追加します。TreeItemsは、他のTreeItemsを含むこともできるので、値の階層構造を作ることができます。リスト8は、図7に示すツリーを作ります。


リスト8. ヘルパー・メソッドを使ってツリーを作る
                

// Create the Tree 
protected Tree createTree(Composite parent, int mode, Node root) {
    tree = new Tree(parent, mode | SWT.MULTI | SWT.V_SCROLL | SWT.H_SCROLL);
    tree.addSelectionListener(new SelectionListener() {
        :
     });
    setTreeContents(root);
    return tree;
}
protected void setTreeContents(Node root) {
    tree.removeAll();
    TreeItem ti = new TreeItem(tree, SWT.NONE);
    setTreeItemContents(ti, root);

}
protected void setTreeItemContents(TreeItem ti, Node root) {
    ti.setText(root.getName());
    java.util.List children = root.getChildren();
    if (children != null && children.size() > 0) {
        for (Iterator i = children.iterator(); i.hasNext();) {
            Node n = (Node)i.next();
            TreeItem tix = new TreeItem(ti, SWT.NONE);
            setTreeItemContents(tix, n);
        }
    }
}
  :
// sample creation code
protected void addChildren(Node n, int count, int depth, String prefix) {
    if (depth > 0) {
        for (int i = 0; i < count; i++) {
            String name = prefix + '.' + i;
            Node child = new Node(name);
            n.addChild(child);
            addChildren(child, count, depth - 1, name);
        }
    }
}

Node root = new Node("<root>");
addChildren(root, 3, 3, "Child");
tree = createTree(this, SWT.CHECK, root);


図7. ツリーの例
図7. ツリーの例

チェック・ボックスはオプションです。



ベース・プログラムを作る

この記事で取り上げている例では、メニューの例を除いて、BasicApplicationと呼ばれるベース・クラスを使って実装を単純化しています。これもベスト・プラクティスの1つですが、私はSWT GUIアプリケーションの共通機能を要素として取り出し、簡単に使えるように、このベース・クラス(メニュー例のヘルパー・メソッドを含めて)に取り入れています。

BasicApplicationは、自分自身のシェルを作るコンポジットです。このクラスには、終了検証ダイアログ(図8)や、診断用の補助としてウィジェット・ツリーをダンプ出力する機能などのサービスもあります(リスト9に示す要約版を見てください)。このクラスのコードについては、参考文献を見てください。


図8. 確認メッセージのダイアログ
図8. 確認メッセージのダイアログ


リスト9. コントロール階層構造の(部分的な)出力
                
Shell {Tree1App Example}
    Tree1App {}
        Tree {}
            TreeItem {<root>}
                TreeItem {Child.0}
                    TreeItem {Child.0.0}
                        TreeItem {Child.0.0.0}
                        TreeItem {Child.0.0.1}
                        TreeItem {Child.0.0.2}
                    TreeItem {Child.0.1}
                        TreeItem {Child.0.1.0}
                        TreeItem {Child.0.1.1}
                        TreeItem {Child.0.1.2}
                    TreeItem {Child.0.2}
                        TreeItem {Child.0.2.0}
                        TreeItem {Child.0.2.1}
                        TreeItem {Child.0.2.2}
                TreeItem {Child.1}
                        :
                TreeItem {Child.2}
                        :

リスト10は、(リスト4でのコンボとリストの例の)各サブクラスのmainメソッドを示しています。これを見ると、シェルのタイトルやサイズ、アプリケーション・コンポジットのスタイル、コマンドライン入力などが分かると思います。


リスト10. リストのアプリケーション例のmainメソッド
                
public static void main(String[] args) {
     run(List1App.class.getName(), "List1App Example", SWT.NONE, 400, 300, args);
}

各サブクラス(Java技術のリフレクションを使ってロードされます)は、コンストラクターとcompleteGuiメソッドを定義する必要があります。サブクラスは、オプションとしてinitGuiメソッドを提供する場合もあります。ここでも、リスト4でのコンボとリストの例を使うと、これらのメソッドは、リスト11に示すようなものになります。


リスト11. アプリケーションのサブクラスで提供される必須メソッド
                
public List1App(Shell shell, int style) {
    super(shell, style);   // must always supply parent and style
}

// Allow subclasses to complete the GUI 
protected void completeGui(String[] args) {
    // create GUI here 
    :
}

// Allow subclasses to initialize the GUI 
protected void initGui() {
    // finish GUI and add dynamic contents here
    :
}

MessageBox

この記事を終わる前に、ユーザーに対して入力を選択するように要求するための、MessageBoxコントロールの使い方を説明しておきましょう。

MessageBoxeには、次に示す相互に排他的な5つのスタイルのうち、どれか1つのスタイルを定義する必要があります。

  1. ICON_ERRORは、エラー・メッセージを表示します。
  2. ICON_INFORMATIONは、情報メッセージを表示します。
  3. ICON_QUESTIONは、質問メッセージを表示します。
  4. ICON_WARNINGは、警告メッセージを表示します。
  5. ICON_WORKINGは、作業メッセージを表示します。

この他にも、MessageBoxeは次のように幾つかのスタイルをサポートしています。それぞれのスタイルが、選択用のボタンを表します。

  • OK, OK | CANCEL
  • YES | NO, YES | NO | CANCEL
  • RETRY | CANCEL
  • ABORT | RETRY | IGNORE

リスト12はMessageBoxの典型的な使い方です。ユーザーがアプリケーション・シェルを閉じると、図8で示した確認ダイアログを表示します。


リスト12. MessageBoxを使って終了確認ダイアログを作る
                
shell.addShellListener(new ShellAdapter() {
        public void shellClosed(ShellEvent e) {
            MessageBox mb = new MessageBox(shell, SWT.ICON_QUESTION | SWT.OK | SWT.CANCEL);
            mb.setText("Confirm Exit");
            mb.setMessage("Are you sure you want to exit?");
            int rc = mb.open();
            e.doit = rc == SWT.OK;
        }
});


まとめ

SWTとJFaceシリーズの今回は、第1回で紹介しなかったSWTコントロールとして、コンボやリスト、テーブル、ツリーなどを紹介しました。また、SWTアプリケーション用のベース・クラスの作り方や、GUIを容易に構築するためにヘルパー・メソッドを使う方法についても説明しました。

次回の記事では、コンテナーや入力コントロールの作り方と、StackLayoutレイアウト・マネージャーの使い方について説明する予定です。





ダウンロード

内容ファイル名サイズダウンロード形式
Java code samplesos-jface2source.ZIP12.2KBHTTP

ダウンロード形式について


参考文献

  • SWTやJFaceが初めての人は、このシリーズの第1回を見てください。単純なSWTアプリケーションの作り方を説明しています(developerWorks, 2005年5月)。

  • スタンドアロン・モードでJFaceおよびSWTを使用する」(developerWorks, 2003年1月)は、幾つかの主なJFaceクラス(そしてSWTウィジェットの幾つか)と共に、ヒントやトリック、設計上の問題点などを紹介しています。

  • Eclipse In Action: A Guide for Java Developers(2003年Independent Pub Group刊)は、Eclipseを使うJava開発者にとって必読の書です。

  • developerWorksの Eclipse articlesを覗いてみてください。

  • Eclipseについて学ぶために、Eclipse.orgのサイトを見てください。技術的なドキュメンテーションやハウツー記事、教育資料、ダウンロード、製品情報など、様々な情報が提供されています。

  • Rob WarnerとRobert Harrisによる、 The Definitive Guide to SWT and JFace (2004年Apress刊)は、この2つの新技術を完全に網羅しています。

  • Migrate your Swing applications to SWT」(developerWorks, 2004年1月)は、SWTとSwingの比較、対比を含んだチュートリアルです。

  • Eclipse Platformを使用したデバッグ」(developerWorks, 2003年5月)は、Eclipseデバッガーの使い方を説明しています。

  • developerWorksのOpen source zoneを見てください。幅広いハウツー情報、ツール、プロジェクトの更新情報などが用意されており、オープンソース技術を利用しての開発や、IBM製品でオープンソース技術を利用するために活用できます。

  • 皆さんの次期オープンソース開発プロジェクトを、IBM trial softwareを使って革新してください。ダウンロード、あるいはDVDで入手することができます。

  • Javaアプリケーション開発用のオープンソースIDEである、Eclipseの最新版を入手してください。

  • developerWorks blogsに参加して、developerWorksコミュニティーの一員になってください。

著者について

Barry Feigenbaum博士は、IBMアクセシビリティ・センターのメンバーです。そこで彼は、IBM製品を障害者にとってアクセシブルなものにするための作業を行うチームに属しています。Feigenbaum博士は、本や記事をいくつか出版しており、いくつかの特許を取り、JavaOneなどの業界で開催される会議で講演したことがあります。彼は、オースティンのテキサス大学で情報科学の非常勤助教授を務めています。

不正使用の報告のヘルプ

不正使用の報告

ありがとうございます。 このエントリーは、モデレーターの注目フラグが設定されました。


不正使用の報告のヘルプ

不正使用の報告

不正使用の報告の送信に失敗しました。


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=237199
ArticleTitle=SWTとJFace 第2回: やさしい紹介
publish-date=07192005
author1-email=feigenba@us.ibm.com
author1-email-cc=

タグ

Help
このタグで、My developerWorks のすべてのタイプのコンテンツを見つけるために検索フィールドを使用します。

スライダーバーを使用することで、より多く(少なく)タグを表示します。

人気のタグは、この特定のコンテンツ・ゾーン(例えば、Java テクノロジー、Linux や WebSphere など)に対するトップのタグを表示します。

マイ・タグは、この特定のコンテンツ・ゾーン(例えば、Java テクノロジー、Linux や WebSphere など)に対するお客様ご自身のタグを表示します。

このタグで、My developerWorks のすべてのタイプのコンテンツを見つけるために検索フィールドを使用します。人気のタグは、この特定のコンテンツ・ゾーン(例えば、Java テクノロジー、Linux や WebSphere など)に対するトップのタグを表示します。マイ・タグは、この特定のコンテンツ・ゾーン(例えば、Java テクノロジー、Linux や WebSphere など)に対するお客様ご自身のタグを表示します。