从线程外更新SWT,无法执行runnable

时间:2014-11-25 13:05:02

标签: java swt

我已经搜索了自己的血腥答案,但是在S / O和网络上任何其他地方都没有解释过的解决方案似乎都没有。

我的项目有两个部分。一部分是SWT呈现的屏幕本身(以及一些基本的事件处理完成)。另一部分是Network-class,它通过套接字处理服务器/客户端通信。

我目前正在尝试允许在程序中更改名称,以便当客户端键入“name Josh”时,它会将屏幕上的名称设置为Josh,更新创建的标签。这就是我被困住的地方。我创建了一个名为“updater”的方法,随着时间的推移,它将扩展到更多,但现在只更新标签。我在GUI类中创建了这个函数,并将其公开以从网络类中调用。但是,当它被调用时,我得到一个错误,说它无法创建该runnable,指向Null指针异常。我尝试了Display.getCurrent();Display.getDefault();UIPlatform.getWorkBench().getDisplay(),但似乎都没有。

更新程序方法(在GUI类中)

public static void updater(String arg)
{
    Display.getDefault().asyncExec(new Runnable()
    {
        public void run()
        {
            if(!lblPlayer2.getText().equals(arg)) { lblPlayer2.setText(arg); }
        }
    });
}

调用updater方法(来自网络类)

IntroScreen.updater(split[1]);

错误

org.eclipse.swt.SWTException: Failed to execute runnable (java.lang.NullPointerException)
at org.eclipse.swt.SWT.error(Unknown Source)
at org.eclipse.swt.SWT.error(Unknown Source)
at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Unknown Source)
at org.eclipse.swt.widgets.Display.runAsyncMessages(Unknown Source)
at org.eclipse.swt.widgets.Display.readAndDispatch(Unknown Source)
at client.IntroScreen.open(IntroScreen.java:44)
at client.IntroScreen.main(IntroScreen.java:29) Caused by: java.lang.NullPointerException
at client.IntroScreen$2.run(IntroScreen.java:155)
at org.eclipse.swt.widgets.RunnableLock.run(Unknown Source)
... 5 more

GUI的完整来源: http://hastebin.com/abolederul.java

网络的完整来源: http://hastebin.com/ipulirifat.java

我在这里碰了一堵砖墙。有没有人知道为什么会这样,如果你这样做,我会喜欢它,如果你能解释我应该如何思考以防止这样的错误。

1 个答案:

答案 0 :(得分:2)

您正试图在错误的一端解决问题。您的Display不为空,并且SWT事件队列已成功接受您的Runnable。失败的是中可运行的代码,因此此行上的某些内容为null:

if(!lblPlayer2.getText().equals(arg)) { lblPlayer2.setText(arg); }

可能是lblPlayer2变量。