Wizardについて物申す
Plugin作っているとJFaceのWizardを使うことはよくある。その中でも時間のかかる処理にはProgressBarを使いたくなることがある。で、実際に実装してみるとこんな感じになる。
button.addSelectionListener(new SelectionListener() { @Override public void widgetDefaultSelected(SelectionEvent e) { ... IRunnableWithProgress runnable = new IRunnableWithProgress(){ @Override public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException { monitor.beginTask("〜〜〜", 100); ... monitor.done(); }}; getWizard().getContainer().run(true, false, runnable); // ? } } @Override public void widgetSelected(SelectionEvent e) { widgetDefaultSelected(e); } });
この実装はあるボタンを選択したときに時間がかかるので、一部の処理をフォークさせることでプログレスバーを表示し、進捗の状況を表示している。気になるのが?の部分。getContainer().run()の第一引数をtrueと指定することで新しいスレッドを作成し、処理をフォークさせていますが、もしフォークさせていないとするとプログレスバーが表示されません。内部ではUIスレッドと違うとぶーたれてSWTExceptionが発生しています。ボタンが押されたときの処理もUIのスレッドだと思っていたのですが、どうも違う様子。なので、たいていの場合フォークさせるように実装しています。
じゃ、逆にフォークさせずにすむ場合とはいかような場合なのかが気になってしょうがない今日この頃。どういうときに使うんでしょうね。