« ワークベンチ・ウィンドウの表示・消去時の処理 | トップページ | ダイアログボタンの変更 »

2004.07.13

ダイアログの自作

Eclipseでは,ウィザードやプロパティ編集のためのダイアログが標準でいくつか準備されている。しかし,ダイアログを自作したいときも出てくるだろう。今回はカスタムダイアログの作成方法について紹介する。

ダイアログの作成は,SWTのDailogクラスを拡張する方法と,JFaceのDialogクラスを拡張する方法の2種類がある。JFaceの方がもちろんダイアログを作りやすくしてくれているので,JFraceのDialogクラスを用いる。自作ダイアログは,Dialogクラスを継承して作成する

  public class MyDialog extends Dialog {
    public MyDialog(Shell parent) {
      super(parent);
    }
    protected Point getInitialSize() {
      return new Point(400, 300);
    }
    protected void configureShell(Shell newShell) {
      super.configureShell(newShell);
      newShell.setText("Title of MyDialog");
    }
    protected Control createDialogArea(Composite parent) {
      Composite composite = (Composite)super.createDialogArea(parent);
      Text text = new Text(composite,
        SWT.MULTI | SWT.V_SCROLL | SWT.BORDER | SWT.WRAP);
      text.setLayoutData(new GridData(GridData.FILL_BOTH));
      text.setText("Hello!");
      return composite;
    }
  }

どんなウィジェット(AWTとかMotifとかGTKとかXawとか)でも,大抵ダイアログを表示するためには,その親となるウィンドウが必要となる。JFaceのDialogクラスの場合も,コンストラクタの呼び出しにShellオブジェクトを必要とする。もちろんこれはnullが許容されるが,ダイアログは何らかのウィンドウに属することは必然だと思うので,実際にはnullを渡すことは避けるべき。

ダイアログに関する各種設定やクライアント領域のコンテンツの作成などは,Dialogクラスで規定されたメソッドをオーバーライドすることにより記述する。

まずはダイアログの大きさを決めるために,getInitialSizeメソッドをオーバーライドし,縦横の大きさを持つPointオブジェクトを返すようにする。ダイアログが開かれる際にこのメソッドが自動的に呼び出され,返却された値がダイアログのサイズとして使用される。

次にダイアログのタイトルバーに表示する文字列だが,これはダイアログのShellオブジェクトに設定することになる。ダイアログが開かれるとき,新しく内部(親のWindowクラスのcreateShellメソッド内)でShellオブジェクトが作られる。作成されたShellオブジェクトに対して操作を行うために,configureShellメソッドをオーバーライドする。configureShellメソッドにはShellオブジェクトが渡されてくるので,まずは親のcnofigureShellメソッドを呼び出し(デフォルトイメージ・レイアウトの設定が行われる),その後でsetTextメソッドを使ってタイトルバーの文字列をセットしている。ここでShellオブジェクトのsetImageメソッドを使えば,イメージを変えることも可能。

そして一番肝心なメソッドがcreateDialogAreaメソッド。createDialogAreaメソッドをオーバーライドし,その中でダイアログのクライアント領域に対してコンポーネントを配置していくコードを記述する。引数で渡されてくるCompositeオブジェクトに対してコンポーネントを配置するのが基本なのだが,実はそれよりも上記のコードのように,一旦親のcreateDialogAreaメソッドを呼び出し,その結果得られるCompositeオブジェクトに対してコンポーネントを配置するほうが良い。親のcreateDialogAreaメソッドの中では,クライアント領域の上下左右に余白が作られ,フォントの設定も施されたCompositeオブジェクトを返却してくれる。上記のコードでは,Textコンポーネントを配置している。

これで基本的には「タイトルバーに文字列が表示され,大きさが300x200のテキストエリアを持つダイアログ」が表示できるようになった。

  Shell shell = ...;
  MyDialog dialog = new MyDialog(shell);
  dialog.open();

というコードを実行することで,以下のようなダイアログが表示される。

my-dialog.gif

JFaceのDialogクラスでは,何もしなくても[OK]ボタンと[Cancel]ボタンを配置してくれる。そしてopenメソッドの戻り値として,何のボタンが押されたかが返却されるので,

  int ret = dialog.open();
  if (ret == IDialogConstants.OK_ID) {
    // [OK]ボタン押下
  } else if (ret == IDialogConstants.CANCEL_ID) {
    // [Cancel]ボタン押下
  }

という判断ができる。ちなみに,ウィンドウの[閉じる]ボタン押下時は,IDialogConstants.CANCEL_IDが返却される。

|

« ワークベンチ・ウィンドウの表示・消去時の処理 | トップページ | ダイアログボタンの変更 »

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/12631/957447

この記事へのトラックバック一覧です: ダイアログの自作:

« ワークベンチ・ウィンドウの表示・消去時の処理 | トップページ | ダイアログボタンの変更 »