ProgressDialogクラスは、時間の掛かる処理を行いながら、ダイアログで進捗度合いを表示する操作を提供します。
ProgressDialogでは、openメソッドではなく、runメソッドを使用します。
ProgressMonitorDialog {
public void run(
boolean fork,
boolean cancelable,
IRunnableWithProgress runnable)
}
fork引数には、runnable引数に指定した処理を行う際、別スレッドで行うかどうかを指定します。
trueを指定することが推奨されていますが、どちらを指定したも、モーダルダイアログボックスになります。
cancelable引数には、中止ボタンを表示するかどうかを指定します。
runnable引数には、IRunnableWithProgress実装クラスのオブジェクトを指定します。
IRunnableWithProgress {
public void run(IProgressMonitor monitor)
}
runメソッドに、行いたい処理を記述します。
その際、引数として受け取ったmonitorに対して、処理の開始、処理の進捗、現在の処理内容、処理の終了を報告します。
IProgressMonitor {
public void beginTask(String name, int totalWork);
public void done();
public boolean isCanceled();
public void subTask(String name);
public void worked(int work);
}
IProgressMonitorインターフェイスで使用するのは、ここに示したメソッドだけで十分です。
その他のメソッドは、ProgressMonitorのフレームワークが使用します。
まず最初に、beginTaskメソッドを呼び出します。
beginTaskメソッドは、処理の開始を宣言します。
name引数は処理の名前、totalWorkでは、処理の総数を指定します。
あるまとまった処理が終わるたびにworkedメソッドを呼び出します。
workedメソッドは、処理がどれだけ終わったかを知らせます。
work引数に指定する数値は、その時終了した処理の数です。
最後にdoneメソッドを呼び出して処理が終了したことを知らせます。
isCanceledメソッドは、適当なところで呼び出して、ユーザが中止ボタンを押したかどうかを確認します。
もしもtrueが返ったら、InterruptedExceptionを投げて、処理を中止します。
subTaskメソッドでは、現在行っている処理の詳細を知らせます。
import java.lang.reflect.InvocationTargetException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.dialogs.ProgressMonitorDialog;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.jface.window.ApplicationWindow;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
public class ProgressMonitorDialogDemonstrate extends ApplicationWindow {
private ProgressMonitorDialogDemonstrate() {
super(null);
}
protected Control createContents(Composite parent) {
Button progDlgOpenner = new Button(parent, SWT.PUSH);
progDlgOpenner.setText("open progress dialog");
progDlgOpenner.pack();
progDlgOpenner.addSelectionListener(progDlgOpennerListener);
return parent;
}
private SelectionListener progDlgOpennerListener = new SelectionAdapter() {
public void widgetSelected(SelectionEvent event) {
ProgressMonitorDialog progressMonitorDlg =
new ProgressMonitorDialog(getShell());
try {
progressMonitorDlg.run(true, true, runnableProgress);
} catch (InterruptedException e) {
MessageDialog.openInformation(
getShell(),
"処理中止",
"処理をキャンセルしました。");
} catch (InvocationTargetException e) {
MessageDialog.openInformation(
getShell(),
"エラー",
"何らかのエラーが発生しました。" +
e.getCause());
}
}
};
private IRunnableWithProgress runnableProgress = new IRunnableWithProgress() {
public void run(IProgressMonitor monitor)
throws InterruptedException {
final short totalTasks = 100;
monitor.beginTask("時間のかかる処理を行っています。", totalTasks);
for (short i=0 ; i < totalTasks ; i++, Thread.sleep(10)) {
monitor.worked(1);
if (i % 10 == 0) {
monitor.subTask((i * 100) / totalTasks +
"%処理が完了しました。");
}
if (monitor.isCanceled()) {
throw new InterruptedException(
"ユーザによって処理が中止されました。");
}
}
monitor.done();
}
};
public static void main(String[] args) {
Window w = new ProgressMonitorDialogDemonstrate();
w.setBlockOnOpen(true);
w.open();
Display.getCurrent().dispose();
}
}