2013-10-04 5 views
3

Я пытаюсь выскакивает диалог (т.е. FileDialog) в Eclipse Plugin, на самом деле, прежде чем из трансформации Acceleo я бег через связанный проект UI Launcher (http://lowcoupling.com/post/51877317162/the-acceleo-ui-launcher-project)Затмение: Получение пустого дисплей

Я пытаясь сделать это в соответствующем методе doGenerate ...

public void doGenerate(IProgressMonitor monitor) throws IOException { 

    Display display = Display.getCurrent(); 
    System.out.println(display); 
    //.... 

но дисплей я получаю пустой Как я должен это делать?

ответ

5

Документация IWorkbench#getDisplay() состояний:

Код всегда должен задать верстак для отображения, а не полагаться на Display.getDefault().

Так используйте:

PlatformUI.getWorkbench().getDisplay() 

вместо этого.

+2

Обратите внимание, что это невозможно использовать в «чистом» приложении e4, где «PlatformUI» не может быть использован. Для 'syncExec' и' asyncExec' используйте 'org.eclipse.e4.ui.di.UISynchronize', которые могут быть введены. –

+0

@ greg-449 Полезно знать. Еще не использовали e4. – Baz

1

Я не уверен, если вы смотрели на это еще, но в документации к классу Display, он говорит, что Display.getCurrent() возвращает

null, если в настоящее время работает поток не является пользовательским интерфейсом для резьбы любой дисплей.

Возможно, это проблема, но без дополнительной информации я не могу сказать.

+0

Да, это проблема, но я до сих пор не вижу, где показать диалог – lowcoupling

0

Вы можете попытаться получить дисплей по умолчанию Display.getDefault() или дисплей верстак PlatformUI.getWorkbench().getDisplay()

Если вы не работает в потоке пользовательского интерфейса, попробуйте следующее:

Display.getDefault().syncExec(new Runnable() { 
    public void run() { 
     // ... do work that updates the screen ... 
    } 
}); 
+0

Вы знаете, что второй метод, который вы предлагаете, указывает, что использование первого не рекомендуется? ;) – Baz

1

Я столкнулась с такой же проблемой. Я использовал getShell().getDisplay() вместо Display.getCurrent(), и это сработало для меня.

Смежные вопросы