随笔-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 阅读(1446) 评论(0)  编辑  收藏

只有注册用户登录后才能发表评论。


网站导航:
博客园   IT新闻   Chat2DB   C++博客   博问