ダイアログ その 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 メソッドをコメントアウトして実行してみました。
タイトルが表示されない ... 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()); }
実行してみると...
出ました。それにしても、こんなに制約の多いプログラミングを強いるのはどうなんでしょ。みんなこれで納得しているのかなぁ。少なくとも、私はいやです。
次はボタンを 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 クラスを派生させたクラスを作りたいと思います。