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
    }
});