大きなzipファイルを一時ディレクトリにコピーし、それを抽出してから、その内容を宛先パスにコピーするなど、長時間実行される操作があります。操作の進行中はプログレス バーも表示します。
Java プロジェクト (非 Eclipse/RCP) であるスタンドアロン SWT UI でこれを実装することになっています。
UI でこのタスクを実行するには、別のスレッドを使用する必要があることを理解しています。UI にキャンセル ボタンがあります。クリックすると、実行されたタスクがロールバックされ、UI に戻り、フリーズせずに正常に終了します。どうすればこれを効果的に達成できますか。以下は、開始するために使用したサンプルコードです。どんな助けでも大歓迎です。
import java.io.File;
import java.io.IOException;
import org.apache.commons.io.FileUtils;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.ProgressBar;
import org.eclipse.swt.widgets.Shell;
public class TestProgressBar {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
final Display display=new Display();
final Shell shell=new Shell(display,SWT.MIN|SWT.CLOSE);
shell.setSize(500,200);
GridLayout gdLayout=new GridLayout();
gdLayout.numColumns=2;
shell.setLayout(gdLayout);
Composite composite = new Composite(shell, SWT.NONE);
composite.setLayout(gdLayout);
GridData gd=new GridData();
final Label lab=new Label(composite, 0);
lab.setText("Performing Job :");
gd.horizontalIndent=10;
gd.horizontalAlignment=SWT.FILL;
lab.setLayoutData(gd);
GridData gdPg=new GridData();
gdPg.horizontalAlignment=SWT.FILL;
final ProgressBar bar = new ProgressBar(composite, SWT.NONE);
bar.setLayoutData(gdPg);
final int maximum = bar.getMaximum();
//System.err.println(maximum);
final Button cancelButton=new Button(composite,SWT.NONE);
cancelButton.setText("Cancel Copy");
new Thread() {
public void run() {
for (final int[] i = new int[1]; i[0] <= maximum; i[0]++) {
try {Thread.sleep (10);} catch (Throwable th) {}
copyOperation();
if (display.isDisposed()) return;
display.asyncExec(new Runnable() {
public void run() {
if (bar.isDisposed ()) return;
bar.setSelection(i[0]);
if(i[0]==maximum)
{
lab.setText("Job Finished!!!");
cancelButton.setEnabled(false);
}
}
});
}
}
}.start();
shell.open();
while(!shell.isDisposed())
{
if(!display.readAndDispatch())
display.sleep();
}
}
protected static void copyOperation() {
// TODO Auto-generated method stub
File zipFile=new File("D:\\Sample.zip");
try {
FileUtils.copyFileToDirectory(zipFile,new File("C:\\Users\\komail\\Desktop"));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}