Java tutorial
import java.net.MalformedURLException; import java.net.URL; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.jface.resource.ImageRegistry; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.CLabel; import org.eclipse.swt.dnd.Clipboard; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.layout.FillLayout; 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.Dialog; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.ProgressBar; import org.eclipse.swt.widgets.Shell; /** * progress bar dialog. * the first, you must know your app execute times, * you need implement two method: * * process(int times); * initGuage(); * * you can implements method: * * cleanUp() * doBefore() * doAfter() * @author yin_zhiguo * yin_zhiguo@hotmail.com * */ public abstract class ProgressBarDialog extends Dialog { private Label processMessageLabel; //info of process finish private Button cancelButton; //cancel button private Composite cancelComposite; private Label lineLabel;// private Composite progressBarComposite;// private CLabel message;// private ProgressBar progressBar = null; // private Object result; // private Shell shell; // private Display display = null; protected volatile boolean isClosed = false;//closed state protected int executeTime = 50;//process times protected String processMessage = "process......";//procress info protected String shellTitle = "Progress..."; // protected Image processImage = SWTUtil.getImageOfMessage();//image protected boolean mayCancel = true; //cancel protected int processBarStyle = SWT.SMOOTH; //process bar style public void setMayCancel(boolean mayCancel) { this.mayCancel = mayCancel; } public void setExecuteTime(int executeTime) { this.executeTime = executeTime; } public void setProcessImage(Image processImage) { this.processImage = processImage; } public void setProcessMessage(String processInfo) { this.processMessage = processInfo; } public ProgressBarDialog(Shell parent) { super(parent); } public abstract void initGuage(); public Object open() { createContents(); //create window shell.open(); shell.layout(); //start work new ProcessThread(executeTime).start(); Display display = getParent().getDisplay(); while (!shell.isDisposed()) { if (!display.readAndDispatch()) { display.sleep(); } } return result; } protected void createContents() { shell = new Shell(getParent(), SWT.TITLE | SWT.PRIMARY_MODAL); display = shell.getDisplay(); final GridLayout gridLayout = new GridLayout(); gridLayout.verticalSpacing = 10; shell.setLayout(gridLayout); shell.setSize(483, 181); shell.setText(shellTitle); final Composite composite = new Composite(shell, SWT.NONE); composite.setLayoutData(new GridData(GridData.FILL, GridData.CENTER, true, false)); composite.setLayout(new GridLayout()); message = new CLabel(composite, SWT.NONE); message.setImage(processImage); message.setLayoutData(new GridData(GridData.FILL, GridData.CENTER, true, false)); message.setText(processMessage); progressBarComposite = new Composite(shell, SWT.NONE); progressBarComposite.setLayoutData(new GridData(GridData.FILL, GridData.CENTER, false, false)); progressBarComposite.setLayout(new FillLayout()); progressBar = new ProgressBar(progressBarComposite, processBarStyle); progressBar.setMaximum(executeTime); processMessageLabel = new Label(shell, SWT.NONE); processMessageLabel.setLayoutData(new GridData(GridData.FILL, GridData.CENTER, false, false)); lineLabel = new Label(shell, SWT.HORIZONTAL | SWT.SEPARATOR); lineLabel.setLayoutData(new GridData(GridData.FILL, GridData.CENTER, false, false)); cancelComposite = new Composite(shell, SWT.NONE); cancelComposite.setLayoutData(new GridData(GridData.END, GridData.CENTER, false, false)); final GridLayout gridLayout_1 = new GridLayout(); gridLayout_1.numColumns = 2; cancelComposite.setLayout(gridLayout_1); cancelButton = new Button(cancelComposite, SWT.NONE); cancelButton.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { isClosed = true; //System.out.println(isClosed); } }); cancelButton.setLayoutData(new GridData(78, SWT.DEFAULT)); cancelButton.setText("cancel"); cancelButton.setEnabled(this.mayCancel); } protected abstract String process(int times); protected void cleanUp() { } protected void doBefore() { } protected void doAfter() { } class ProcessThread extends Thread { private int max = 0; private volatile boolean shouldStop = false; ProcessThread(int max) { this.max = max; } public void run() { doBefore(); for (final int[] i = new int[] { 1 }; i[0] <= max; i[0]++) { // final String info = process(i[0]); if (display.isDisposed()) { return; } display.syncExec(new Runnable() { public void run() { if (progressBar.isDisposed()) { return; } // processMessageLabel.setText(info); // progressBar.setSelection(i[0]); // if (i[0] == max || isClosed) { if (isClosed) { shouldStop = true;// cleanUp();// } shell.close();// } } }); if (shouldStop) { break; } } doAfter(); } } public void setShellTitle(String shellTitle) { this.shellTitle = shellTitle; } public void setProcessBarStyle(boolean pStyle) { if (pStyle) this.processBarStyle = SWT.SMOOTH; else this.processBarStyle = SWT.NONE; } } class DemoProgressBar extends ProgressBarDialog { private String[] info = null; public DemoProgressBar(Shell parent) { super(parent); } @Override public void initGuage() { info = new String[100]; for (int i = 0; i < info.length; i++) { info[i] = "process task " + i + "."; } this.setExecuteTime(100); this.setMayCancel(true); this.setProcessMessage("please waiting...."); this.setShellTitle("Demo"); } @Override protected String process(int arg0) { try { Thread.sleep((long) (Math.random() * 300)); } catch (Exception e) { e.printStackTrace(); } return info[arg0 - 1]; } } class SWTUtil { private static ImageRegistry imageRegistry = new ImageRegistry(); private static Clipboard clipboard = new Clipboard(Display.getCurrent()); private static final String ___IMAGE_Of_MESSAGE = ""; static { imageRegistry.put(___IMAGE_Of_MESSAGE, ImageDescriptor.createFromURL(newURL("file:icons/info2.gif"))); } private SWTUtil() { } public static URL newURL(String url_name) { try { return new URL(url_name); } catch (MalformedURLException e) { throw new RuntimeException("Malformed URL " + url_name, e); } } public static void registryImage(String id, String urlName) { imageRegistry.put(id, ImageDescriptor.createFromURL(newURL(urlName))); } public static Image getImage(String id) { return imageRegistry.get(id); } public static Clipboard getClipboard() { return clipboard; } public static Image getImageOfMessage() { return imageRegistry.get(___IMAGE_Of_MESSAGE); } } class PBDialogDemo extends Shell { public static void main(String args[]) { try { Display display = Display.getDefault(); PBDialogDemo shell = new PBDialogDemo(display, SWT.SHELL_TRIM); shell.open(); shell.layout(); while (!shell.isDisposed()) { if (!display.readAndDispatch()) display.sleep(); } } catch (Exception e) { e.printStackTrace(); } } public PBDialogDemo(Display display, int style) { super(display, style); createContents(); } protected void createContents() { setText("ProgressBar Dialog"); setSize(218, 98); setLayout(new FillLayout()); final Button openProgressbarDialogButton = new Button(this, SWT.NONE); openProgressbarDialogButton.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { DemoProgressBar dpb = new DemoProgressBar(PBDialogDemo.this); dpb.initGuage(); dpb.open(); } }); openProgressbarDialogButton.setText("Open ProgressBar Dialog"); } protected void checkSubclass() { } }