最近在学习swt的东西,遇到一个问题,特转录如下。 SWT异常: org.eclipse.swt.SWTException: Invalid thread access 在创建SWT界面的线程之外的线程中尝试去修改界面元素.将抛出以下异常 Exceptioninthread"Thread-0"org.eclipse.swt.SWTException:Invalidthreadaccess atorg.eclipse.swt.SWT.error(SWT.java:2942) atorg.eclipse.swt.SWT.error(SWT.java:2865) atorg.eclipse.swt.SWT.error(SWT.java:2836) 上述Thread-0是另外开启的一个线程. 【解析】: 在SWT程序中, SWT会自动创建一个用户界面线程 非用户界面线程不能直接操作用户界面线程 要想在另外一个线程中尝试修改用户界面,应采用一下方法: if(!this.display.isDisposed()){ Runnablerunnable=newRunnable(){ publicvoidrun(){ //你改界面的代码 } }; display.syncExec(runnable);//关键在这一句上(同步调用,等待主界面线程处理完成之后) } swt-doc中的说明: public void syncExec(java.lang.Runnable runnable)Causes the run() method of the runnable to be invoked by the user-interface thread at the next reasonable opportunity. The thread which calls this method is suspended until the runnable completes. Parameters: runnable - code to run on the user-interface thread. (同步调用,需要等待主界面处理完成之后,才能继续) 此外,与之对应的另一个方法: public void asyncExec(java.lang.Runnable runnable)Causes the run() method of the runnable to be invoked by the user-interface thread at the next reasonable opportunity. The caller of this method continues to run in parallel, and is not notified when the runnable has completed. Parameters: runnable - code to run on the user-interface thread. (异步调用,不等待主界面线程处理结果)
怎么解决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界面,都要通过上面类似的办法来做,不然就会报错的 呵呵,就是这样,问我为什么,我也说不清,呵呵,也不敢乱说,怕误人子弟啊,如果你知道的话,就详细一点告诉我吧,也让大家来学习和分享你的知识
相关推荐
多线程Socket阻塞模式下通信的例子 BCB-Socket阻塞模式通讯测试(多线程) 作者:Sncel(地狱情人) QQ:6522203 指导:invalid(空心菜) QQ:309283 http://bcb.vicp.net 测试方法: 在单机上测试: 如果有多个客户...
This document is the API specification for the JNA library for simplified native library access for Java.
Invalid
oracle error invalid rowid
This profile defines the generic procedures related to discovery of Bluetooth devices (idle mode procedures) and link management aspects of connecting to Bluetooth devices (connecting mode procedures)...
打开vs提示invalid handle 解决方法
Delphi 10.3 ,程序运行到DataModule2.ClientDataSet1.ApplyUpdates(0);语句时,提示“Invalid parameter”错误
invalid
JNA_3.5.1 包含两个文件 jna-3.5.1.jar platform-3.5.1.jar 需要的就下载吧
在ios开发过程中经常出现EXC_BAD_ACCESS错误而导致程序崩溃,这里将介绍如何利用XCode和Instrument来查找错误发生的地方,从而更好的定位
Altium Designer 19 原理图复制出现InvalidParameter at AdvSch.dll, Base Addre... 报错的解决办法
博客教程《微信公众平台开发教程第22篇-如何保证access_token长期有效》的配套代码,教程地址如下: http://blog.csdn.net/lyq8479/article/details/25076223
invalid multibyte character sequence 870告警1
一键修复 Chrome浏览器崩溃 STATUS_INVALID_IMAGE_HASH Win10中Edge浏览器此页存在问题 STATUS_INVALID_IMAGE_HASH
invalid syntax是什么错误
format ' x' invalid or incompatible with argument 解决办法
invalid_cache.csv
微信JS-SDK Demo代码 invalid signature错误详解在readme里面
识别和纠正交叉参考数据中DOI错误导致的无效引用_Identifying and correcting invalid citations due to DOI errors in Crossref data.pdf
解决Invalid byte 1 of 1-byte UTF-8 sequence