// 下階層用テンプレート
#topicpath
----
//ここにコンテンツを記述します。

[[エラーログの制御>Eclipse/プラグイン開発のTIPS集/エラーログの制御]] で、エラーが発生したときのロギング、またそのログを表示するためのエラー・ログビューについて書きました。次はエラーをユーザに通知するエラーダイアログ機能を調べてみました。

#contents

**エラーダイアログの制御方法について [#f9f575af]
EclipseはStatusオブジェクトを使用したエラーダイアログ表示機能があります。エラーダイアログは、
 org.eclipse.jface.dialogs.ErrorDialog
というクラスを用います。

やり方は簡単で、[[エラーログの制御>Eclipse/プラグイン開発のTIPS集/エラーログの制御]]で出てきたMultiStatusのオブジェクトを使って、以下のようにErrorDialog#openError を呼び出します。
 MultiStatus mStatus = new MultiStatus(SamplePlugin
         .getPluginId(), IStatus.OK, "マルチステータスのメッセージ",
         new Exception("マルチのエラーメッセージ"));
 IStatus status = new Status(IStatus.ERROR, SamplePlugin
         .getPluginId(), IStatus.OK, "メッセージ1", new Exception(
         "エラーメッセージ1"));
 mStatus.add(status);
 status = new Status(IStatus.INFO, SamplePlugin.getPluginId(),
         IStatus.OK, "メッセージ2", new Exception("エラーメッセージ2"));
 mStatus.add(status);
 Shell shell = getSite().getWorkbenchWindow().getShell();
 ErrorDialog.openError(shell, null, null, mStatus);  <-ダイアログ表示処理
そうすると以下のようなエラーダイアログが表示されます。

#ref(error01.png)

更にこのダイアログには詳細ボタンがあり、それをクリックすると以下の画面が表示されます。

#ref(error02.png)

メイン部分の「マルチステータスのメッセージ」は、MultiStatusの第3引数の文字列、詳細部分のメッセージは、
 MutliStatusクラスの例外クラスのメッセージ
  |--- MutliStatusのなかの1個目のStatusクラスの第3引数の文字列
  |--- MutliStatusのなかの1個目のStatusクラスの例外クラスのメッセージ
  |--- MutliStatusのなかの2個目のStatusクラスの第3引数の文字列
  |--- MutliStatusのなかの2個目のStatusクラスの例外クラスのメッセージ
  |--- ......
となります。

**タイトルの文言を変えるなど、ちょっとしたカスタマイズ [#raa96b61]
 ErrorDialog.openError(shell, null, null, mStatus);
のnullの箇所に文字を設定することで、ちょっとですが表示を変更することができます。

#ref(error03.png)

また、もろもろのStatusクラスの引数のうち、例外クラスを受け取る箇所をnullにしてみると、こんな感じになります。

#ref(error04.png)

**普通のユーザ通知にも使う。 [#d178f4bb]
このやり方でやれば例外が発生していなくても、ユーザ通知に使うことができそうですね。例外を全てnullにして、MultuStatus内のStatusもERRORでなくて全てINFOとしてみます。コーディングは以下の感じですね。
 MultiStatus mStatus = new MultiStatus(SamplePlugin
         .getPluginId(), IStatus.OK, "マルチステータスのメッセージ", null);
 IStatus status = new Status(IStatus.INFO, SamplePlugin
         .getPluginId(), IStatus.OK, "メッセージ1", null);
 mStatus.add(status);
 status = new Status(IStatus.INFO, SamplePlugin.getPluginId(),
         IStatus.OK, "メッセージ2", null);
 mStatus.add(status);
 Shell shell = getSite().getWorkbenchWindow().getShell();
 ErrorDialog.openError(shell, "完了しました", "処理が完了しました。", mStatus);

そうするとこのようなダイアログが表示されました。

#ref(info.png)


ErrorDialogってのが気になりますが、処理が完了しました、とか普通の通知にも使えそうです。



**普通のStatusの場合も [#c0f626f4]
流れでMultiStatusを先にやりましたが、普通のStatusの場合ももちろん使えます。
 IStatus status = new Status(IStatus.ERROR, SamplePlugin
         .getPluginId(), IStatus.OK, "メッセージ1", new Exception(
         "エラーメッセージ1"));
 Shell shell = getSite().getWorkbenchWindow().getShell();
 ErrorDialog.openError(shell, null, null, status);

エラー画面はこんな感じ。
#ref(errorStatus.png)

***例外を渡さないと、詳細ボタンは表示されない。 [#m80191f9]
予想通りって感じですが、
 IStatus status = new Status(IStatus.ERROR, SamplePlugin
         .getPluginId(), IStatus.OK, "メッセージ1", null);
 ErrorDialog.openError(shell, null, null, status);
というように例外を渡さないと、詳細ボタンと詳細を表示する領域は現れませんでした。
#ref(noDetail.png)

ただ、MultiStatusを使用した場合はどうしても詳細領域がでちゃいますね。ダメ元で
 MultiStatus mStatus = new MultiStatus(SamplePlugin
         .getPluginId(), IStatus.OK, "マルチステータスのメッセージ", null);
 IStatus status = new Status(IStatus.ERROR, SamplePlugin
         .getPluginId(), IStatus.OK, null, null);
 mStatus.add(status);

とかやったら、nullはダメだって例外が発生しちゃいました。







----
この記事は
#vote(おもしろかった[14],そうでもない[1])
#vote(おもしろかった[15],そうでもない[1])

#comment
#topicpath


SIZE(10){現在のアクセス:&counter;}

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS