【问题标题】:SWT - MessageDialog - ShellsSWT - MessageDialog - 外壳
【发布时间】:2012-09-21 17:56:44
【问题描述】:

我有一个没有 gui 的操作类。该课程主要进行数据管理。该类是从我的主 GUI 中的方法调用的。我遇到的问题是在出现故障时向用户显示消息。我正在使用MessageDialog,但它在运行时一直失败。我认为问题在于壳牌。当我尝试使用null 作为外壳时。

MessageDialog.openError(null, "Printer Error Message", "Error getting print reply file.");

错误是空指针异常

MessageDialog.openError(Display.getCurrent().getActiveShell() etc

错误是空指针异常

MessageDialog.openError(Display.getDefault().getActiveShell()

错误是无效的线程访问

  1. 由于这不是 GUI 类,我是否必须从 GUI 父级传入 shell?
  2. 我可以在类中创建一个 shell 然后使用它吗?

【问题讨论】:

  • 我最终使用了你的两个答案。我没有导入正确的 Shell 类。我还必须使用 Display.getDefault().asyncExec(new Runnable() { 来避免线程问题。并且不知道如何选择两者作为答案
  • 您不能同时选择两者作为答案。您可以对两者都投赞成票,然后选择您将接受的一个作为答案。

标签: java dialog swt


【解决方案1】:

您可以使用 Display.syncExecDisplay.asyncExec 修复 ERROR_THREAD_INVALID_ACCESS 错误。尝试:

Display.syncExec(new Runnable() {
    void run() {
        MessageDialog.openError(Display.getDefault().getActiveShell()...
    }
}

【讨论】:

    【解决方案2】:

    这会做你想做的事:

    MessageDialog.openError(new Shell(), "Printer Error Message", "Error getting print reply file.");
    

    只需创建一个新的Shell 并将其传递给MessageDialog

    【讨论】:

    • @jkteater 构造函数new Shell() 确实存在。你确定你导入了正确的Shell 类吗?
    • @jkteater 它存在 - help.eclipse.org/juno/…
    【解决方案3】:

    需要考虑的几个要点。

    1. 首先,不要将数据管理类(模型)与 UI 混合。
    2. 有一个实用程序类和方法来显示错误/信息消息。
    3. 始终在 UI 线程中访问 UI 小部件。使用Display.getDefault().asyncExec()syncExce()
    4. 检查Display.getDefault().getActiveShell() 将其传递给 对话框优先,如果为null,则创建一个并传递它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多