SWT异常: org.eclipse.swt.SWTException: Invalid thread access

最近在学习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. (异步调用,不等待主界面线程处理结果)
阅读更多

struts SWT 错误 org.eclipse.swt.SWTException: Invalid thread access

01-11

[code=Java][/code]部分错误信息rn[code=Java]rnrnorg.eclipse.swt.SWTException: Invalid thread accessrn at org.eclipse.swt.SWT.error(Unknown Source)rn at org.eclipse.swt.SWT.error(Unknown Source)rn at org.eclipse.swt.SWT.error(Unknown Source)rnrn[/code]rn代码rn[code=Java]rnrnpackage bean;rnrnimport java.io.FileOutputStream;rnimport java.io.OutputStreamWriter;rnimport java.sql.ResultSet;rnimport java.sql.ResultSetMetaData;rnimport java.sql.SQLException;rnrnimport org.eclipse.swt.SWT;rnimport org.eclipse.swt.widgets.Display;rnimport org.eclipse.swt.widgets.FileDialog;rnimport org.eclipse.swt.widgets.MessageBox;rnimport org.eclipse.swt.widgets.Shell;rnrnimport util.PageDBConnection;rnrnpublic class SaveFileSqlBeanrn rn public boolean sqlInPutOutPutBean() throws Exceptionrn rn boolean SqlInPutOutPutBeanErrors = false ;rn ResultSet rs = null;rn rn try rn rn FileDialog dlg; rn Display display = new Display();rn Shell shell = new Shell(display);rn dlg = new FileDialog(shell, SWT.SAVE);rn rn dlg.setFilterNames(new String[]rn "Text Files(*.txt)",rn "Sql Files (*.xls)",rn "All Files (*.*)"rn );rn dlg.setFilterExtensions(new String[] rn "*.txt", "*.xls", "*.*"rn );rn String fileName = null;rnrn String fn = "";rnrn if (fn.equals(""))rn rn fileName = dlg.open();rn if(fileName != null)rn fn = fileName;rn rn if (fn != "")rn rn rn final String SQL = "select * from dzjc_sfje ;rn System.out.println(SQL);rn rn rs = PageDBConnection.getResultSet(SQL);rn rn byte[] b = null;rn FileOutputStream fos = new FileOutputStream(fn);rn OutputStreamWriter out = new OutputStreamWriter(fos);rn out.write(dlg.getText());rn ResultSetMetaData meta = rs.getMetaData();rn for(int i=1; i

没有更多推荐了,返回首页