2012-10-25 30 views
0

我是java noob程序员,我有SWT异常的问题无效的线程访问,我找到了,我发现它发生在你尝试从一个线程接口项目这不是UI线程。但我不知道如何解决它。Java:无效的线程访问

问题: 我有4类:

  • 通知 - 创建SWT窗口,显示通知
  • 主线 - 从网上下载内容,并使用通知类显示通知
  • 窗口 - 它显示托盘图标,设置,它是主类 - 它启动主线程
  • 类,显示第二个swt窗口中的通知。

问题是它无效的线程访问崩溃。我不知道如何以显示两个窗口SWT(完全不同的类)


该应用程序的下载网页,分析它,并得到了我想要的信息。然后使用类通知它显示通知。我添加了类窗口这是SWT窗口,它显示托盘图标,有设置它也是主类和该类运行ZadaneReader线程。 第一个问题:应该以其他方式添加SWT窗口(主要目标是:托盘图标和设置)吗?

我的应用程序包含以下类:

  • ZadaneReader - 它的下载网页,分析它,并与类通知,它显示通知
  • 通知 - 该类显示了2种方式notifiations: 一)使用exec 通知发送(但它只是Ubuntu的那种方式)和b)它创建对象UniNotifyWindow是第二个显示通知的SWT窗口
  • UniNotifyWindow - swt窗口显示出其自身的通知
  • 窗口 - 设置,托盘图标,此刻主类,它开始它的线程和ZadaneReader螺纹

此刻:它的时候,我不使用UniNotifyWindow 我的作品我没有使用Window(用测试者类开始Zadane线程)。

我想这是个不好的问题,我犯了很多错误,但我希望你不要责怪我,但如果你能告诉我我做错了什么,我会很高兴。

来源:https://docs.google.com/open?id=0B5VL4J_7HrgaTkt4a1Q2VVQxZEE

+0

你能提供一个小而干净的例子吗?你知道关键字像事件调度线程:[并发在Swing](http://docs.oracle.com/javase/tutorial/uiswing/concurrency/index.html)和/或[SwingUtilities.invokeLater](http:/ /docs.oracle.com/javase/7/docs/api/javax/swing/SwingUtilities.html#invokeLater(java.lang.Runnable)) –

回答

2

您可以从主(又名 “显示器”)的线程只能访问SWT UI元素。这意味着你不能像从另一个线程的文本框中设置文本一样多。推动工作,以显示线程最简单的方法是通过调用

Display.getDefault().asyncExec(...) 

但是要注意,你应该在你在你的显示器的线程中运行什么离散 - 长时间运行的任务将让你的用户界面反应迟钝。

相关问题