zoukankan      html  css  js  c++  java
  • org.eclipse.swt.SWTException: Invalid thread access问题解决方法

    转自 http://blog.csdn.net/ecjtuxuan/article/details/2125023

    怎么解决SWT多线程错误:Caused by: org.eclipse.swt.SWTException: Invalid thread access

    我这几天研究JAVA做MSN,下载的示例都是在控制台下显示的,现在要做一个桌面MSN,要在界面上显示运行情况,比如,登录时,在文本框中显示"正在登录,请稍后....",登录成功后显示"登录成功....."等,以及其它一系列事件都要在界面上显示..

    我用的是SWT Designer来做界面的,界面上有账号和密码输入框,登录及退出按钮,以及显示运行刻录的文本框.

    现 在只是做了登录,要在文本框里显示登录情况,网上的代码都是通过System.out.println在控制台里显示,而现在我要将记录显示在文本框里, 开始时,我就直接按照调用类方法的办法调,可是总出现Caused by: org.eclipse.swt.SWTException: Invalid thread access这个错误,我查询后知道,这是因为SWT界面线程不能在其它线程里进行操作等.

    由于以前没做过JAVA桌面程序,也没做过JAVA多线程,所以花了我一天多的时间,都没搞定.下午,在utopian的帮助下,才搞定,太多的道理我也说不清,呵呵,我对JAVA也不是很熟悉,只是在JSP里用到了点皮毛而已.我只说一下我的最后解决方法

    我就是在那个新线程(其实是一个处理监听事件的接口对象)需要修改界面的地方,那一段代码包起来,比如在我这个MSN的处理对象中,有一个消息是登录成功的消息

    原来在控制台下显示消息的代码:
      /**
       * 登录成功后执行该方法
       */
      public void loginComplete(MsnFriend own) {
       System.out.println(own.getLoginName() + " Login OK");
        }

    而想要界面里显示,则改成:
      /**
       * 登录成功后执行该方法
       */
      public void loginComplete(MsnFriend own) {
        Display.getDefault().syncExec(new Runnable() {
        public void run() {
        allTxt.setText("登录成功....");
        }
        }); 
       }

    开始我只是写了allTxt.setText("登录成功....");这行代码,就一直报那个错,后来,改成    
       Display.getDefault().syncExec(new Runnable() {
        public void run() {
        allTxt.setText("登录成功....");
        }
        }); 
       这样就没问题了,也就是说,在非SWT线程的线程里想要修改SWT界面,都要通过上面类似的办法来做,不然就会报错的

    呵呵,就是这样,问我为什么,我也说不清,呵呵,也不敢乱说,怕误人子弟啊,如果你知道的话,就详细一点告诉我吧,也让大家来学习和分享你的知识

  • 相关阅读:
    day 46
    day 45 JavaScript 下 函数
    day 42 css 样式
    44 JavaScript
    41 前端
    40 协程 i/0多路复用
    39 线程池 同一进程间的队列
    38 线程 锁 事件 信号量 利用线程实现socket 定时器
    37 生产者消费者模型 管道 进程间的数据共享 进程池
    演示使用string对象
  • 原文地址:https://www.cnblogs.com/cupsuccess/p/3713504.html
Copyright © 2011-2022 走看看