0

我是 java noob 程序员,我遇到了 SWT Exception Invalid thread access 的问题,我已经找到了,我发现当你尝试从不是 UI 线程的线程中对接口项进行操作时,就会发生这种情况。但我不知道如何解决它。

问题: 我有 4 个课程:

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

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


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

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

  • ZadaneReader - 它下载网页,解析它并使用类Notify,它显示通知
  • 通知 - 该类以 2 种方式显示通知:a)使用 exec notify-send(但它仅是 Ubuntu)和 b)它创建对象 UniNotifyWindow,这是显示通知的第二个 SWT 窗口
  • UniNotifyWindow - 显示自己的通知的 swt 窗口
  • 窗口 - 设置、托盘图标、启动线程时的主类和 ZadaneReader 线程

目前:当我不使用 UniNotifyWindow或者我不使用 Window 时它可以工作(使用测试器类启动 Zadane 线程)。

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

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

4

1 回答 1

2

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

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

请注意,您应该在显示线程中运行的内容保持离散 - 长时间运行的任务会使您的 UI 无响应。

于 2012-10-25T19:51:21.480 回答