<更新記録>
2007年 12月 29日
執筆

姉妹サイト検索 Web検索


ProgressDialog

ProgressDialog

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メソッドでは、現在行っている処理の詳細を知らせます。

ProgressMonitorDialogDemonstrate.java
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();
	}
}


Powered by VeryEasyCMS