2

eclipse のジョブ API を使用して大きなタスクをジョブとして実行しています。タスクが完了すると、ブール変数を true に設定し、その変数が true の場合、UI スレッドで WizardDialog を実行しています。私の現在のコードは次のようになります。

Job longRunningJob = new Job("Long running job...") {
    @Override
    protected IStatus run(IProgressMonitor monitor) {

        boolean shouldShowDialog = doLongRunningJob();

        if(shouldShowDialog) {
          Display.getDefault().asyncExec(new Runnable() {
               @Override
               public void run() {
                    //Will open wizard dialog here
                    WizardDialog wizardDialog = new WizardDialog(Display.getCurrent().getActiveShell(), new TestWizard());
                    wizardDialog.setBlockOnOpen(true);
                    wizardDialog.open();
               }
          });
        }
    }
}

longRunningJob.setUser(true);
longRunningJob.schedule();

私の問題はrun、信頼できる方法で実行されていない表示スレッド内にあります。つまり、実行メソッド内に入ることがありますが、そうでない場合があるため、runメソッド内にブレークポイントを配置してテストしようとしましたが、同じことが起こります。

私の質問は、私がやっていることは正しい方法ですか? これは予想される動作ですか?では、このシナリオをどのように処理すればshouldShowDialogよいですか。

編集:デバッグ中に観察した1つの動作は、ダイアログが表示されるが、突然閉じてしまうことです。スレッドを終了していると思います。

4

1 に答える 1

5

ダイアログが消える問題は、現在アクティブなシェルをダイアログの親として使用することが最も一般的な原因です。たとえば、ダイアログを作成するときに ProgressDialog が開いている場合、その他のダイアログがダイアログの親になります。他のダイアログが閉じると、あなたのダイアログも閉じます。

代わりに、次のようなものを使用します。

PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();
于 2013-09-13T11:38:24.080 に答える