Java-SWT-newrunnable单击submit按钮
我有点害怕Java-SWT-newrunnable单击submit按钮,java,swt,runnable,Java,Swt,Runnable,我有点害怕 Exception in thread "Controller Thread" org.eclipse.swt.SWTException: Invalid thread access 快速概述我要完成的工作: 我在提交按钮上有一个监听器,我想启动一个新的线程,因为应用程序处理各种url的工作量很大 这是我在提交按钮侦听器中的部分代码 submitButton.addSelectionListener(new SelectionAdapter() { @Ove
Exception in thread "Controller Thread" org.eclipse.swt.SWTException: Invalid thread access
快速概述我要完成的工作:
我在提交按钮上有一个监听器,我想启动一个新的线程,因为应用程序处理各种url的工作量很大
这是我在提交按钮侦听器中的部分代码
submitButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent arg0) {
try {
// Check to see if http field is valid
httpValid = checkHttp(http);
if (httpValid) {
Thread t = new Thread(new UIMain(), "Controller Thread");
t.start();
} else {
System.out.println("Not a Valid http");
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
这是我的跑步方法
public void run() {
options = new Options();
setOptions(options);
Controller run = new Controller(options);
}
错误指向“设置选项(选项)”行
选项是一个对象,保存用户将输入的SWF字段中的一些数据。setOptions相当简单,在该函数中,我从SWF字段收集数据,并在对象中设置它们
让我知道如果我需要发布更多的代码
我正在setOptions(options)中执行的一些代码的示例
谢谢,您不能从单独的线程直接访问SWT UI。您应该做的是使用displayapi从单独的线程执行异步调用 例如:
Display.getDefault().asyncExec(new Runnable() {
@Override
public void run() {
// access the SWT UI
}
});
好的,这和读取字段的值是一样的,对吗?到目前为止,我没有试图更新SWT显示中的任何元素,只是创建一个新线程来进行一些繁重的处理。根据我的理解,您永远不应该直接从单独的线程访问SWT UI,因为SWT UI在其自己的线程中运行时,它是用于读取还是写入值并不重要。如果你只是需要这些值来启动一个繁重的进程,为什么不在从UI获取值之后初始化线程呢?好的,让我来试一试,我们会的,我认为它正在工作。这就是我所拥有的。。。[code]httpValid=checkHttp(http);如果(httpValid){options=new options();setOptions(options);run=new Controller(options);Thread t=new Thread(new UIMain(),“Controller Thread”);t.start();}else{System.out.println(“非有效http”);}[/code],并在运行时。。。[code]public void run(){main(null);}[/code]很好,因为您不需要从单独的线程在UI中执行任何修改,最好的选择是使用所需的值初始化线程,而不是从线程初始化。然后错误就是它所说的。您已经有一个GUI线程(按下按钮),并且正在生成一个新线程,这是一个GUI窗口。swt明确不允许这样做。生成的线程在处理gui对象时必须使用Display.asyncExec()或syncExec()。@Whnunlife如果有助于解决问题,即使答案并不完美,您也应该接受它。。。
Display.getDefault().asyncExec(new Runnable() {
@Override
public void run() {
// access the SWT UI
}
});