这是问题所在。
我的主要类实现了SerialPortEventListener
。发生串行事件后,我必须检查String
中的Text
(我使用的是SWT API)。显然,我无法使用Text
与Text.getText()
中的文字联系,并获得SWTException: Invalid thread access
。
我厌倦了这里(Invalid Thread Access Error with Java SWT)和其他一些类似的帖子,但是使用这种方法我会遇到其他一些问题。
如何访问用户界面的成员以检查其值?
答案 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;
}
}