Java/SWT JFace Eclipse/Thread

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

Illustrates multithread UI programming issues

   <source lang="java">

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

* Copyright (c) 1998, 2004 Jackwind Li Guojie
* All right reserved. 
* 
* Created on Oct 25, 2003 4:12:32 PM by JACK
* $Id: PICalculator.java,v 1.1 2003/12/22 12:07:54 jackwind Exp $
* 
* visit: http://www.asprise.ru/swt
*****************************************************************************/

import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Shell; /**

* Illustrates multithread UI programming issues.
*/

public class PICalculator {

 Display display = new Display();
 Shell shell = new Shell(display);
 Button buttonThread = new Button(shell, SWT.PUSH);
 Button buttonAsyncExec = new Button(shell, SWT.PUSH);
 public PICalculator(boolean asyncExecEnabled) {
   final boolean async = asyncExecEnabled;
   shell.setText("PI Calculator");
   shell.setSize(400, 80);
   Rectangle clientArea = shell.getClientArea();
   buttonThread.setText(
     "Click here to calculate PI  [Non-UI thread UI Update]");
   buttonThread.setBounds(
     clientArea.x,
     clientArea.y,
     clientArea.width,
     clientArea.height / 2);
   buttonThread.addSelectionListener(new SelectionListener() {
     public void widgetDefaultSelected(SelectionEvent e) {
     }
     public void widgetSelected(SelectionEvent e) {
       buttonThread.setText("Calculation in progress ...");
       getTask(buttonThread).start();
     }
   });
   
   buttonAsyncExec.setText("Click here to calculate PI  [asynExec method UI Update]");
   buttonAsyncExec.setBounds(
     clientArea.x,
     clientArea.y + clientArea.height / 2,
     clientArea.width,
     clientArea.height / 2);
   buttonAsyncExec.addSelectionListener(new SelectionListener() {
     public void widgetDefaultSelected(SelectionEvent e) {
     }
     public void widgetSelected(SelectionEvent e) {
       buttonAsyncExec.setText("Calculation in progress ...");
       getTask2(buttonAsyncExec).start();
     }
   });
   shell.open();
   while (!shell.isDisposed()) {
     if (!display.readAndDispatch()) {
       display.sleep();
     }
   }
   display.dispose();
 }
 public static void main(String[] args) {
   // new CalculatePI(false);
   new PICalculator(true);
 }
 public Thread getTask(Button button) {
   final Button theButton = button;
   return new Thread() {
     public void run() {
       double pi = calculatePI(9999999);
       theButton.setText("PI = " + pi); // Update UI.
     }
   };
 }
 public Thread getTask2(Button button) {
   final Button theButton = button;
   return new Thread() {
     public void run() {
       final double pi = calculatePI(9999999);
       
       display.asyncExec(new Runnable() {
         public void run() {
           
           // Update UI.
           
           theButton.setText("PI = " + pi); 
           
         }
       });
     }
   };
 }  
 /**
  * Calculate value of PI using Vieta"s formula. For a complete discussion,
  * please visit:
  * http://documents.wolfram.ru/v4/GettingStarted/CalculatingPi.html
  * 
  * @param nestedLevel -
  *            level of nested square roots in Vieta"s formula.
  * @return value of PI
  */
 public static double calculatePI(int nestedLevel) {
   double product = 1;
   double lastSqrtValue = 0;
   for (int i = 0; i < nestedLevel; i++) {
     double sqrt = getNextSqrtValue(lastSqrtValue);
     product *= 0.5 * sqrt;
     lastSqrtValue = sqrt;
   }
   return 2 / product;
 }
 /**
  * Return the square root item value.
  * 
  * @param lastValue -
  *            last square root item value.
  * @return
  */
 public static double getNextSqrtValue(double lastValue) {
   return Math.sqrt(2 + lastValue);
 }

}


      </source>
   
  
 
  



SWT and Thread

   <source lang="java">

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

* Copyright (c) 1998, 2004 Jackwind Li Guojie
* All right reserved. 
* 
* Created on Oct 26, 2003 2:45:03 PM by JACK
* $Id: SyncExecExample.java,v 1.1 2003/12/22 12:07:54 jackwind Exp $
* 
* visit: http://www.asprise.ru/swt
*****************************************************************************/

import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Shell; /**

* syncExec Example. 
*/

public class SyncExecExample {

 public static void main(String[] args) {
   final Display display = new Display();
   Shell shell = new Shell(display);
   
   final Runnable print = new Runnable() {
     public void run() {
       System.out.println("Print from thread: \t" + Thread.currentThread().getName());
     }
   };
   
   final Thread applicationThread = new Thread("applicationThread") {
     public void run() {
       System.out.println("Hello from thread: \t" + Thread.currentThread().getName());
       display.syncExec(print);
       System.out.println("Bye from thread: \t" + Thread.currentThread().getName());
     }
   };
   
   shell.setText("syncExec Example");
   shell.setSize(300, 100);
   
   Button button = new Button(shell, SWT.CENTER);
   button.setText("Click to start");
   button.setBounds(shell.getClientArea());
   button.addSelectionListener(new SelectionListener() {
     public void widgetDefaultSelected(SelectionEvent e) {
     }
     public void widgetSelected(SelectionEvent e) {
       applicationThread.start();
     }
   });
   
   shell.open();    
   
   
   while(! shell.isDisposed()) {
     if(! display.readAndDispatch()) {// If no more entries in event queue
       display.sleep();
     }
   }
   
   display.dispose();
 
 }

}


      </source>