2017-01-10 11 views
1

Я реализовал представление Eclipse, расширив ViewPart. В этом конкретном представлении я также внедрил поле ввода текста Text и несколько кнопок, которые выполняют определенную команду Eclipse.Как установить содержимое текстового элемента SWT из экземпляра класса, который вызывается командой Eclipse?

Например:

IHandlerService handlerService = (IHandlerService) PlatformUI 
           .getWorkbench().getService(
             IHandlerService.class); 
handlerService.executeCommand("com.company.commandxyz", null); 

Эта команда вызывает обработчик, который затем вызывает службу вклиниться в расширениях DSF. Чтобы быть конкретным, я внедрил обычай CommandFactory, расширив CommandFactory_6_8. Это позволяет мне отправлять команды в очередь на GDB, а затем возвращать результат. Тем не менее, я хочу установить ответ в текстовом поле, которое находится в представлении, где был вызван com.example.commandxyz.

К сожалению, я не могу передать какую-либо ссылку на эту реализацию расширения DSF. Я попытался следующий код, чтобы получить представление Eclipse, для того, чтобы впоследствии установить текст (который является собственностью этой точки зрения):

IViewPart vp = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().showView("com.example.myview"); 

Однако, я получаю следующее исключение при вызове:

Exception in thread "MI RX Thread" java.lang.NullPointerException 

Любая идея, как я могу получить доступ к потоку пользовательского интерфейса, чтобы получить свойство представления, чтобы его установить?

ответ

2

Код PlatformUI, который вы укажете, должен запускаться в потоке пользовательского интерфейса.

Используйте Display.asyncExec или Display.syncExec, чтобы выполнить код в потоке пользовательского интерфейса из какой-либо другой темы.

С Java 8 использования:

Display.getDefault().asyncExec(() -> { ... code to run in UI thread }); 

В более ранних версиях Java использовать:

Display.getDefault().asyncExec(new Runnable() { 
    public void run() { 
    ... code to run in UI thread 
    } 
}); 

asyncExec запускает код UI асинхронно в следующий раз пользовательский интерфейс готов для запуска кода. syncExec работает синхронно, блокируя текущий поток, пока пользовательский интерфейс не запускает код.

+0

Вы являетесь героем. Как в мире я мог это пропустить. У меня уже было это, как вы сказали мне, но я только поставил вызов метода (из моего представления) в run(). Большое спасибо. –