如何从其他线程访问textEdit值?

时间:2014-05-15 12:09:01

标签: java multithreading swt

这是问题所在。

我的主要类实现了SerialPortEventListener。发生串行事件后,我必须检查String中的Text(我使用的是SWT API)。显然,我无法使用TextText.getText()中的文字联系,并获得SWTException: Invalid thread access

我厌倦了这里(Invalid Thread Access Error with Java SWT)和其他一些类似的帖子,但是使用这种方法我会遇到其他一些问题。

如何访问用户界面的成员以检查其值?

1 个答案:

答案 0 :(得分:0)

正如异常消息中所述:您正在尝试从与Display-Thread不同的线程访问UI-Element。

当我刚接触SWT时,我也偶然发现了几次。

您可以使用以下方法调用正确的线程来避免此问题:

        Display.getDefault().asyncExec(Runnable)

        Display.getDefault().syncExec(Runnable)

这样,您可以定义匿名runnable以从Text中访问所需的信息。

编辑:既然您已经在Display上了解了这些方法,那么您现在必须知道如何从该runnable返回一个值,对吧? 解决方案取决于您将如何处理这些值。如果它不是一个长时间阻塞的操作,你可以继续在Display-Thread中进行它,这样你就不必实现线程间的通信。

否则,您可以使用其他线程等待的Monitor-Object。如果Display-Thread(带有runnable)然后读完了Text的值,它可以调用该Monitor上的notify(可以是任何变量),这样你的等待Thread就可以继续了。

EDIT2,因为我无法发表评论:

MyRunnable runnable = new MyRunnable();
Display.getDefault().syncExec(runnable);

System.out.println(runnable.getText());


private class MyRunnable implements Runnable
{
    String myString;

    @Override
    public void run()
    {
       //Here you can also get the text from your Text-Object
        myString = "MyText";
    }

    String getText()
    {
        return myString;
    }
}