在eclipse插件中使用SWT

时间:2012-08-30 13:19:22

标签: java eclipse eclipse-plugin swt

我正在尝试使用SWT在eclipse插件中创建对话框。我可以创建一个Shell和一个Display对象,代码编译时没有任何问题但我在调试插件时看不到任何类型的对话框,尽管在独立应用程序中使用时,相同的代码运行完美。

这是我在SampleAction的run方法中编写的一个示例代码,它实现了IWorkbenchWindowActionDelegate

Display display = new Display();
Shell shell = new Shell(display);
shell.open();


while(!shell.isDisposed())
{
    if(!display.readAndDispatch())
    {
        display.sleep();
    }
}

display.dispose();

我也尝试删除readAndDispatch并编写了这段代码但它仍然无效..我什么也看不见

    Display display = new Display();
    Shell shell = new Shell(display);
    shell.open();
    MessageDialog dialog = new MessageDialog(shell, "My Title", null,
            "My message", MessageDialog.ERROR, new String[] { "First",
          "Second", "Third" }, 0);
    int result = dialog.open();

2 个答案:

答案 0 :(得分:3)

这将完成这项工作。无需事先打开新的外壳。只需将新Shell传递给MessageDialog

MessageDialog dialog = new MessageDialog(new Shell(), "My Title", null,
        "My message", MessageDialog.ERROR, new String[] { "First",
      "Second", "Third" }, 0);
int result = dialog.open();

您还可以使用当前所在GUI部件的parentShell并将其传递给对话框。

答案 1 :(得分:1)

请注意,使用新shell作为模式对话框的父级可能会给用户带来不便,因为对话框可能会在主工作台窗口后面,因此使用既不能看到对话框也不能在主工作台窗口中执行任何操作。解决方案是将窗口shell作为父对象传递给对话框。由于您的操作是IWorkbenchWindowActionDelegate,您应该记录传递给init方法的窗口,然后使用window.getShell()来获取父shell。

请注意,编写插件时不应创建显示或运行事件队列(即readAndDispatch)(除非您需要无模式对话框 - 这是一个单独的主题)。