読者です 読者をやめる 読者になる 読者になる

ダイアログ その 1

昨日のつづきで TitleAreaDialog を使って、JAR ファイル作成ダイアログを作ろうと思います。

まずはタイトルとメッセージを付けましょうか。

        public void run(IAction action) {
            IWorkbench workbench = WrpePlugin.getDefault().getWorkbench();
            IWorkbenchWindow workBenchWindow = workbench.getActiveWorkbenchWindow();
            Shell shell =  workBenchWindow.getShell();

            Dialog dialog = new TitleAreaDialog(shell);
            dialog.setTitle("Create JAR File.");
            dialog.setMessage("Fill in the form.", IMessageProvider.NONE);

            System.out.println(dialog.open());
        }

TitleAreaDialog クラスの setTitle メソッドで上部の白い部分に大きく表示され、setMessage メソッドでその下のエリアに表示されるはずなのですが... 実行してみると、

Unhandled event loop exception
Reason:
java.lang.NullPointerException

どうやら、setMessage メソッドで NullPointerException が出てしまっているようです。それじゃ、setMessage メソッドをコメントアウトして実行してみました。

TitleAreaDialog

タイトルが表示されない ... orz

まったく、わけわからん。

Web で調べてみたら (JFrace とか SWT のページは、いままで調べてきたものにくらべてずっと多いんですね)、どうやら createDialogArea をオーバーライドして、その中で setTitle/setMessage するらしいのです。

とりあえず、やってみましょう。

        public void run(IAction action) {
            IWorkbench workbench = WrpePlugin.getDefault().getWorkbench();
            IWorkbenchWindow workBenchWindow = workbench.getActiveWorkbenchWindow();
            Shell shell =  workBenchWindow.getShell();

            TitleAreaDialog dialog = new TitleAreaDialog(shell) {
                public Control createDialogArea(Composite parent) {
                    setTitle("Create JAR File.");
                    setMessage("Fill in the form.", IMessageProvider.NONE);
                
                    return super.createDialogArea(parent);
                }
            };

            System.out.println(dialog.open());
        }

実行してみると...

TitleAreaDialog

出ました。それにしても、こんなに制約の多いプログラミングを強いるのはどうなんでしょ。みんなこれで納得しているのかなぁ。少なくとも、私はいやです。

次はボタンを OK/Cancel でなくて、Create/Cancel にしてみます。

        public void run(IAction action) {
            IWorkbench workbench = WrpePlugin.getDefault().getWorkbench();
            IWorkbenchWindow workBenchWindow = workbench.getActiveWorkbenchWindow();
            Shell shell =  workBenchWindow.getShell();

            TitleAreaDialog dialog = new TitleAreaDialog(shell) {
                public Control createDialogArea(Composite parent) {
                    setTitle("Create JAR File.");
                    setMessage("Fill in the form.", IMessageProvider.NONE);
                
                    return super.createDialogArea(parent);
                }

                protected void createButtonsForButtonBar(Composite parent) {
                    createButton(
                      parent,
                      IDialogConstants.OK_ID,
                      "Create",
                      true);
                    createButton(
                      parent,
                      IDialogConstants.CANCEL_ID,
                      IDialogConstants.CANCEL_LABEL,
                      false);
                  }
            };

            System.out.println(dialog.open());
        }

これも createButtonForButtonBar メソッドをオーバーライドしなくてはいけないようです。

TitleAreaDialog

そろそろコードも長くなってきたので、無名クラスではなくて TitleAreaDialog クラスを派生させたクラスを作りたいと思います。