
何か気付いたら、70人とか応募が来ちゃってて、どうしようかなーと。
直感的に理解し易い話と、分り辛いけど、必要な話を用意しました。



スタート、ストップ、その他の3つのボタン及び、
プログレスバーのあるUIを実装する事で、
プログラミングモデルの違いを明らかにします。



Swing版を実装するに当って、
Swing Application Framework(SAF)を使用しています。
SAFでは、@Actionを使ってメソッドを
ApplicationContextのActionMapに登録し、
それをコンポーネント作成時に取り出して、
AbstractButton#setActionに引き渡す事で、
イベントと紐付ける事が出来ます。
イベントを処理するメソッドでは、
SwingWorkerを継承したTaskオブジェクトを返す事で、
処理内容を非同期化する事が可能になります。
ActionMap actionMap = Application.getInstance(
desktopapplication1.DesktopApplication1.class)
.getContext()
.getActionMap(DesktopApplication1View.class, this);
jButton1.setAction(actionMap.get("startProgress"));
〜〜〜
@Action(block = Task.BlockingScope.ACTION)
public Task startProgress() {
switchButton(false);
this.progressTask = new StartProgressTask(getApplication());
return this.progressTask;
}
private class StartProgressTask extends
org.jdesktop.application.Task
WindowsFormでは、BackgroundWorkerと言うAPIを使います。
このAPIを使うのは非常に簡単で、
以下の3つのイベントを実装するだけです。
private void backgroundWorker1_DoWork
(object sender, DoWorkEventArgs e) {
BackgroundWorker bw = sender as BackgroundWorker;
for (int i = 0; i < 100; i++) {
if (e.Cancel = bw.CancellationPending) {
return;
} else {
Thread.Sleep(100);
bw.ReportProgress(1);
}
}
}
private void backgroundWorker1_ProgressChanged
(object sender, ProgressChangedEventArgs e) {
progressBar1.Increment(e.ProgressPercentage);
}
private void backgroundWorker1_RunWorkerCompleted
(object sender, RunWorkerCompletedEventArgs e) {
if (e.Cancelled == false) {
MessageBox.Show(this,"Finished");
}
this.progressBar1.Value = 0;
switchButton(true);
}
SWTでは、Rich Client Platform(RCP)上にUIを構築します。
RCPは、SWTによるスタンドアロンアプリケーションを実装する為の環境です。
RCPでは、Jobと言うクラスを使ってバックグラウンド処理を実現します。
Jobでは、そのサブクラス毎に実装するメソッドが違うのですが、
今回はrunメソッドを実装します。
Job job = new Job("heavy work") { //$NON-NLS-1$
@Override
protected IStatus run(IProgressMonitor monitor) {
try {
for (int i = 0; i < 100; i++) {
if (monitor.isCanceled()) {
return Status.CANCEL_STATUS;
} else {
Thread.sleep(100);
monitor.worked(1);
}
}
} catch (InterruptedException e) {
return Status.CANCEL_STATUS;
} finally {
monitor.done();
}
return Status.OK_STATUS;
}
};
job.schedule();