Java/SWT JFace Eclipse/ProgressBar

Материал из Java эксперт
Перейти к: навигация, поиск

A progress bar dialog

   <source lang="java">

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.ruposite; 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.ru
* 
*/

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() {
 }

}

      </source>
   
  
 
  



Count Numbers

   <source lang="java">

/******************************************************************************

* All Right Reserved. 
* Copyright (c) 1998, 2004 Jackwind Li Guojie
* 
* Created on 2004-3-31 1:19:00 by JACK
* $Id$
* 
*****************************************************************************/

import org.eclipse.swt.SWT; import org.eclipse.swt.events.PaintEvent; import org.eclipse.swt.events.PaintListener; import org.eclipse.swt.graphics.Font; import org.eclipse.swt.graphics.FontMetrics; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.ProgressBar; import org.eclipse.swt.widgets.Shell; public class CountNumbers {

 Display display = new Display();
 Shell shell = new Shell(display);
 Button button;
 ProgressBar progressBar;
 
 public CountNumbers() {
   GridLayout gridLayout = new GridLayout(1, true);
   shell.setLayout(gridLayout);
   
   button = new Button(shell, SWT.BORDER);
   button.setText("Start to count");    
   
   progressBar = new ProgressBar(shell, SWT.SMOOTH);
   progressBar.setMinimum(0);
   progressBar.setMaximum(10);
   
   
   final Thread countThread = new Thread(){
     public void run() {
       for(int i=0; i<=10; i++) {
         final int num = i;
         try {
           Thread.sleep(1000);
         } catch (InterruptedException e) {
           e.printStackTrace();
         }
         
         shell.getDisplay().asyncExec(new Runnable(){
           public void run() {
             if(button.isDisposed() || progressBar.isDisposed())
               return;
             button.setText("Counting: " + num);
             progressBar.setSelection(num);
             //progressBar.redraw();
           }
         });
       }
     }
   };
   
   button.addListener(SWT.Selection, new Listener() {
     public void handleEvent(Event event) {
       button.setEnabled(false);
       countThread.start();
     }
   });
   
   progressBar.addPaintListener(new PaintListener() {
     public void paintControl(PaintEvent e) {
       System.out.println("PAINT");
       // string to draw. 
       String string = (progressBar.getSelection() * 1.0 /(progressBar.getMaximum()-progressBar.getMinimum()) * 100) + "%";
       
       Point point = progressBar.getSize();
       Font font = new Font(shell.getDisplay(),"Courier",10,SWT.BOLD);
       e.gc.setFont(font);
       e.gc.setForeground(shell.getDisplay().getSystemColor(SWT.COLOR_WHITE));
       
       FontMetrics fontMetrics = e.gc.getFontMetrics();
       int stringWidth = fontMetrics.getAverageCharWidth() * string.length();
       int stringHeight = fontMetrics.getHeight();
       
       e.gc.drawString(string, (point.x-stringWidth)/2 , (point.y-stringHeight)/2, true);
       font.dispose();
     }
   });
 
   button.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
   progressBar.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
   shell.setSize(300, 100);
   shell.open();
   //textUser.forceFocus();
   // Set up the event loop.
   while (!shell.isDisposed()) {
     if (!display.readAndDispatch()) {
       // If no more entries in event queue
       display.sleep();
     }
   }
   display.dispose();
 }
 private void init() {
 }
 public static void main(String[] args) {
   new CountNumbers();
 }

}


      </source>
   
  
 
  



Demonstrates ProgressBar

   <source lang="java">

//Send questions, comments, bug reports, etc. to the authors: //Rob Warner (rwarner@interspatial.ru) //Robert Harris (rbrt_harris@yahoo.ru) import org.eclipse.swt.SWT; import org.eclipse.swt.layout.*; import org.eclipse.swt.widgets.*; /**

* This class demonstrates ProgressBar
*/

public class ProgressBarExample {

 public static void main(String[] args) {
   Display display = new Display();
   Shell shell = new Shell(display);
   shell.setLayout(new GridLayout());
   
   // Create a smooth progress bar
   ProgressBar pb1 = new ProgressBar(shell, SWT.HORIZONTAL | SWT.SMOOTH);
   pb1.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
   pb1.setMinimum(0);
   pb1.setMaximum(30);
   
   // Create an indeterminate progress bar
   ProgressBar pb2 = new ProgressBar(shell, SWT.HORIZONTAL | SWT.INDETERMINATE);
   pb2.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
   
   // Start the first progress bar
   new LongRunningOperation(display, pb1).start();
   
   shell.open();
   while (!shell.isDisposed()) {
     if (!display.readAndDispatch()) {
       display.sleep();
     }
   }
 }

}

/**

* This class simulates a long running operation
*/

class LongRunningOperation extends Thread {

 private Display display;
 private ProgressBar progressBar;
 public LongRunningOperation(Display display, ProgressBar progressBar) {
   this.display = display;
   this.progressBar = progressBar;
 }
 
 public void run() {
   // Perform work here--this operation just sleeps
   for (int i = 0; i < 30; i++) {
     try {
       Thread.sleep(1000);
     } catch (InterruptedException e) {
       // Do nothing
     }
     display.asyncExec(new Runnable() {
       public void run() {
         if (progressBar.isDisposed()) return;
         
         // Increment the progress bar
         progressBar.setSelection(progressBar.getSelection() + 1);
       }
     });
   }
 }

}

      </source>
   
  
 
  



ProgressBar Example

   <source lang="java">

import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.ProgressBar; import org.eclipse.swt.widgets.Shell; public class ProgressBarExample {

 Display d;
 Shell s;
 ProgressBarExample() {
   d = new Display();
   s = new Shell(d);
   s.setSize(250, 250);
   
   s.setText("A ProgressBar Example");
   final ProgressBar pb = new ProgressBar(s, SWT.HORIZONTAL);
   pb.setMinimum(0);
   pb.setMaximum(100);
   pb.setSelection(50);
   pb.setBounds(10, 10, 200, 20);
   s.open();
   while (!s.isDisposed()) {
     if (!d.readAndDispatch())
       d.sleep();
   }
   d.dispose();
 }
 public static void main() {
   new ProgressBarExample();
 }

}


      </source>
   
  
 
  



ProgressBar Examples

   <source lang="java">

/******************************************************************************

* All Right Reserved. 
* Copyright (c) 1998, 2004 Jackwind Li Guojie
* 
* Created on 2004-3-31 0:13:36 by JACK
* $Id$
* 
*****************************************************************************/

import org.eclipse.swt.SWT; 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 ProgressBarExamples {

 Display display = new Display();
 Shell shell = new Shell(display);
 public ProgressBarExamples() {
   init();
   
   ProgressBar pb1 = new ProgressBar(shell, SWT.NULL);
   final ProgressBar pb2 = new ProgressBar(shell, SWT.SMOOTH);
   ProgressBar pb3 = new ProgressBar(shell, SWT.INDETERMINATE);
   

// pb2.addPaintListener(new PaintListener() { // public void paintControl(PaintEvent e) { // Point point = pb2.getSize(); // // Font font = new Font(shell.getDisplay(),"Courier",10,SWT.BOLD); // e.gc.setFont(font); // e.gc.setForeground(shell.getDisplay().getSystemColor(SWT.COLOR_WHITE)); // // FontMetrics fontMetrics = e.gc.getFontMetrics(); // int stringWidth = fontMetrics.getAverageCharWidth() * 4; // int stringHeight = fontMetrics.getHeight(); // // e.gc.drawString("60%", (point.x-stringWidth)/2 , (point.y-stringHeight)/2, true); // font.dispose(); // } // });

   pb1.setSelection(60);
   pb2.setSelection(60);
   
   pb1.setBounds(100, 10, 200, 20);
   pb2.setBounds(100, 40, 200, 20);
   //pb3.setBounds(100, 70, 200, 20);
   
   Label label = new Label(shell, SWT.NULL);
   label.setText("(default)");
   Label label2 = new Label(shell, SWT.NULL);
   label2.setText("SWT.SMOOTH");
   
   label.setAlignment(SWT.RIGHT);
   label2.setAlignment(SWT.RIGHT);
   label.setBounds(10, 10, 80, 20);
   label2.setBounds(10, 40, 80, 20);
   
   shell.pack();
   shell.open();
   //textUser.forceFocus();
   // Set up the event loop.
   while (!shell.isDisposed()) {
     if (!display.readAndDispatch()) {
       // If no more entries in event queue
       display.sleep();
     }
   }
   display.dispose();
 }
 private void init() {
 }
 public static void main(String[] args) {
   new ProgressBarExamples();
 }

}


      </source>
   
  
 
  



Update a progress bar (from the UI thread)

   <source lang="java">

/*

* ProgressBar example snippet: update a progress bar (from the UI thread)
*
* For a list of all SWT example snippets see
* http://dev.eclipse.org/viewcvs/index.cgi/%7Echeckout%7E/platform-swt-home/dev.html#snippets
*/

import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.ProgressBar; import org.eclipse.swt.widgets.Shell; public class Snippet57 { public static void main (String [] args) {

 Display display = new Display ();
 Shell shell = new Shell (display);
 ProgressBar bar = new ProgressBar (shell, SWT.SMOOTH);
 bar.setBounds (10, 10, 200, 32);
 shell.open ();
 for (int i=0; i<=bar.getMaximum (); i++) {
   try {Thread.sleep (100);} catch (Throwable th) {}
   bar.setSelection (i);
 }
 while (!shell.isDisposed ()) {
   if (!display.readAndDispatch ()) display.sleep ();
 }
 display.dispose ();

} }


      </source>
   
  
 
  



Update a SWT progress bar (from another thread)

   <source lang="java">

/*

* ProgressBar example snippet: update a progress bar (from another thread)
*
* For a list of all SWT example snippets see
* http://dev.eclipse.org/viewcvs/index.cgi/%7Echeckout%7E/platform-swt-home/dev.html#snippets
*/

import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.ProgressBar; import org.eclipse.swt.widgets.Shell; public class Snippet56 {

 public static void main(String[] args) {
   final Display display = new Display();
   Shell shell = new Shell(display);
   final ProgressBar bar = new ProgressBar(shell, SWT.SMOOTH);
   bar.setBounds(10, 10, 200, 32);
   shell.open();
   final int maximum = bar.getMaximum();
   new Thread() {
     public void run() {
       for (final int[] i = new int[1]; i[0] <= maximum; i[0]++) {
         try {
           Thread.sleep(100);
         } catch (Throwable th) {
         }
         if (display.isDisposed())
           return;
         display.asyncExec(new Runnable() {
           public void run() {
             if (bar.isDisposed())
               return;
             bar.setSelection(i[0]);
           }
         });
       }
     }
   }.start();
   while (!shell.isDisposed()) {
     if (!display.readAndDispatch())
       display.sleep();
   }
   display.dispose();
 }

}

      </source>