隨筆-10  評論-11  文章-20  trackbacks-0

          要在后臺線程里對前臺界面組件進行訪問.

          解決方法是使用Display對象,Display對象主要負責管理事件循環和控制UI線程和其它線程之間的通信.
          Display.getDefault().asyncExec(new Runnable(){
              public void run(){
              //對前臺界面進行操作
              }
          });
          1. package com.tr069im.ui;  
          2.  
          3. import org.eclipse.swt.SWT;  
          4. import org.eclipse.swt.layout.GridData;  
          5. import org.eclipse.swt.widgets.Button;  
          6. import org.eclipse.swt.widgets.Display;  
          7. import org.eclipse.swt.widgets.MessageBox;  
          8. import org.eclipse.swt.widgets.ProgressBar;  
          9. import org.eclipse.swt.widgets.Shell;  
          10.  
          11. /**  
          12.  * 此類通過實現SWT滾動條,說明多線程問題 .解決了后臺線程訪問前臺界面的問題   
          13.  * @author llwbrothers  
          14.  */ 
          15. public class Login implements Runnable {  
          16.     private static Shell shell;  
          17.     private String loginResponse = "right";  
          18.     private static boolean flag = false;  
          19.  
          20.     public Login() {  
          21.  
          22.     }  
          23.  
          24.     public static void main(String[] args) {  
          25.           
          26.         final Display display = Display.getDefault();  
          27.         shell = new Shell(SWT.MIN);  
          28.         shell.setSize(290520);  
          29.         shell.setLocation(3005);  
          30.         shell.setText("SWT多線程");  
          31.  
          32.         // 添加平滑的進度條  
          33.         final ProgressBar pb1 = new ProgressBar(shell, SWT.HORIZONTAL  
          34.                 | SWT.SMOOTH);  
          35.         pb1.setBounds(7228216020);  
          36.         pb1.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));  
          37.         // 顯示進度條的最小值  
          38.         pb1.setMinimum(0);  
          39.         // 設置進度條的最大值  
          40.         pb1.setMaximum(30);  
          41.  
          42.         // 登錄按鈕  
          43.         final Button btnLogin = new Button(shell, SWT.FLAT | SWT.PUSH);  
          44.         btnLogin.setBounds(8036311136);  
          45.         btnLogin.setText("取消");  
          46.  
          47.         shell.open();  
          48.         // 異步線程處理其他數據  
          49.         display.asyncExec(new Runnable() {  
          50.             public void run() {  
          51.                 Login pl = new Login();  
          52.                 Thread t = new Thread(pl);  
          53.                 t.start();  
          54.             }  
          55.         });  
          56.         // 添加線程,在線程中處理長時間的任務,并最終反映在平滑進度條上  
          57.         Runnable runnable = new Runnable() {  
          58.             public void run() {  
          59.                 for (int i = 0; i < 30; i++) {  
          60.                     try {  
          61.                         Thread.sleep(100);  
          62.                     } catch (InterruptedException e) {  
          63.                     }  
          64.                     display.asyncExec(new Runnable() {  
          65.                         public void run() {  
          66.                             if (pb1.isDisposed())  
          67.                                 return;  
          68.                             // 進度條遞增  
          69.                             pb1.setSelection(pb1.getSelection() + 1);  
          70.                         }  
          71.                     });  
          72.                     if (flag) { // 作為標志,使滾動條起作用  
          73.                         break;  
          74.                     }  
          75.                     if (i == 29) {  
          76.                         open();  
          77.                     }  
          78.                 }  
          79.             }  
          80.         };// 啟動這個線程  
          81.         new Thread(runnable).start();  
          82.  
          83.         while (!shell.isDisposed()) { // 如果主窗體沒有關閉  
          84.             if (!display.readAndDispatch()) { // 如果display不忙  
          85.                 display.sleep(); // 休眠  
          86.             }  
          87.         }  
          88.         display.dispose(); // 銷毀display  
          89.     }  
          90.  
          91.     public void run() {  
          92.         try {  
          93.             // 收到驗證信息后進行  
          94.             if (loginResponse.equals("right")) {  
          95.                 // 后臺線程訪問前臺界面  
          96.                 Display.getDefault().asyncExec(new Runnable() {  
          97.                     public void run() {  
          98.                         flag = true;  
          99.                         Shell shell = new Shell(SWT.MIN);  
          100.                         MessageBox messageBox = new MessageBox(shell,  
          101.                                 SWT.ICON_WARNING);  
          102.                         messageBox.setMessage("用戶名或密碼錯誤!");  
          103.                         messageBox.open();  
          104.                     }  
          105.                 });  
          106.  
          107.             } else {      
          108.             }  
          109.         } catch (Exception ee) {  
          110.         }  
          111.     }  
          112.  
          113.     public static void open() {  
          114.         Display.getDefault().asyncExec(new Runnable() {  
          115.             public void run() {  
          116.                 // 進度條進行完之后,執行的程序  
          117.             }  
          118.         });  
          119.     }  
          120. }  
          posted on 2011-04-17 21:57 Soap MacTavish 閱讀(1457) 評論(0)  編輯  收藏

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 鹤山市| 巨野县| 海淀区| 蕉岭县| 天柱县| 绥化市| 溧阳市| 正宁县| 黔江区| 时尚| 青浦区| 襄樊市| 盈江县| 施秉县| 轮台县| 道真| 会理县| 遵义县| 永顺县| 固始县| 乐清市| 专栏| 沙田区| 广水市| 孙吴县| 盐边县| 济阳县| 峨山| 乐昌市| 泾源县| 兰考县| 英超| 新民市| 高唐县| 巴青县| 台湾省| 肃宁县| 垦利县| 从江县| 三穗县| 云阳县|