2014-11-25 59 views
2

我已经搜索了自己血腥的答案,但没有解决方案在S/O或网络上的任何其他地方解释似乎没有工作。从线程更新SWT,未能执行可运行

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

我现在正在做的是试图允许在程序中更改名称,以便当客户端键入“名称Josh”时,它会将屏幕上的名称设置为Josh,更新创建的标签。这是我卡住的地方。我创建了一个名为“updater”的方法,随着时间的推移,这个方法将会扩展更多,但现在只更新一个标签。我在GUI类中创建了这个函数,并公开从网络类中调用它。但是,当它被调用时,我收到一个错误,说它无法创建可运行的,指向空指针异常。我试过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); } 
     } 
    }); 
} 

电话更新方法(从网络级)

IntroScreen.updater(split[1]);

ERROR

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 

为妫满来源:http://hastebin.com/abolederul.java

为网络提供完整的源:http://hastebin.com/ipulirifat.java

我已经在这里打了一个砖墙。有没有人知道为什么会出现这种情况,如果你这样做,我会很喜欢它,如果你能解释我应该如何思考,以防止类似这样的错误发生。

回答

2

您试图在错误的一端解决问题。您的Display不为空,并且您的Runnable已被SWT事件队列成功接受。什么是失败的代码是可运行的,所以一些在这条线是空:

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

这可能是lblPlayer2变量。

+0

你是完全正确的!似乎我没有像我分配lblPlayer1一样分配lblPlayer2。 lblPlayer2被创建为'Label lblPlayer2',即使我已经创建了该对象。感谢您提供非常快速(最终正确)的答案!一旦计时器耗尽,我会接受你的答案。 – CmdrSharp 2014-11-25 13:13:20