2014-10-25 3 views
1

Я пытаюсь настроить свой вид с помощью EPartService, но все же получаю исключение в этой строке с вызовом findPart. Я делаю это правильно?Eclipse 4 RCP - Приложение не имеет активного окна

Исключение:

Caused by: java.lang.IllegalStateException: Application does not have an active window 
    at org.eclipse.e4.ui.internal.workbench.ApplicationPartServiceImpl.getActiveWindowService(ApplicationPartServiceImpl.java:36) 
    at org.eclipse.e4.ui.internal.workbench.ApplicationPartServiceImpl.findPart(ApplicationPartServiceImpl.java:87) 

Код:

package cz.vutbr.fit.xhriba01.bc.handler; 

import javax.inject.Inject; 
import javax.inject.Named; 

import org.eclipse.e4.core.di.annotations.Execute; 
import org.eclipse.e4.ui.services.IServiceConstants; 
import org.eclipse.e4.ui.workbench.modeling.EPartService; 
import org.eclipse.jface.viewers.TreeViewer; 
import org.eclipse.jface.window.Window; 
import org.eclipse.swt.widgets.Shell; 

import cz.vutbr.fit.xhriba01.bc.ui.ExplorerView; 
import cz.vutbr.fit.xhriba01.bc.ui.dialogs.NewFromDirectoryDialog; 

public class NewFromDirectoryHandler { 

    @Inject 
    private EPartService fPartService; 

    @Execute 
    public void execute(@Named(IServiceConstants.ACTIVE_SHELL) Shell shell) { 

     NewFromDirectoryDialog dialog = new NewFromDirectoryDialog(shell); 
     dialog.create(); 
     if (dialog.open() == Window.OK) { 
      String sourceDir = dialog.getSourceDir(); 
      String classDir = dialog.getClassDir(); 
      TreeViewer tv = ((ExplorerView)fPartService.findPart("bc.part.explorer").getObject()).getTreeViewer(); 
     } 
    } 

} 
+0

У меня также была та же проблема, и это сработало! [https://stackoverflow.com/a/38230627/5799676](https://stackoverflow.com/a/38230627/5799676) –

ответ

4

Попробуйте инъекции EPartService в качестве аргумента метода execute:

@Execute 
public void execute(EPartService fPartService, @Named(IServiceConstants.ACTIVE_SHELL) Shell shell) 

Лучше всего избегать инъекции полей в обработчик, поскольку они будут вводиться только один раз при создании обработчика. Такие вещи, как EPartService, меняются при изменении активной части.

+0

Могу ли я спросить, хорошо ли, как я общаюсь с моим пользовательским интерфейсом? Поскольку теперь я читал, что классы моделей могут быть удалены (но я не знаю, когда), поэтому, если MPart расположен, он расположен даже в том классе, который он показывает (ExplorerView в моем случае)? Потому что в этом случае информация из диалога будет потеряна, поскольку она существует только в этом ExplorerView. – Krab

+0

Обычно я просто использовал '@Named (IServiceConstants.ACTIVE_PART) MPart activePart', чтобы ввести активную часть и убедиться, что обработчик активен только для правильной части. –

+0

i хотя где хранить информацию, чтобы быть уверенным, что они не будут удалены позже (например, может быть классом, представляющим представление для MPart, расположенным затмением, или eclipse будет распоряжаться именно этим MPart, а позже, когда этот MPart будет отображаться, он будет использовать существующий взгляд)? В настоящее время я просто настраиваю TreeViewer. Но если этот TreeViewer будет удален и отображен снова, он не будет иметь ввода. – Krab

0

Я думаю, что вам нужно написать что-то вроде этого:

public class NewFromDirectoryHandler { 

    @Inject 
    private EPartService fPartService; 

    @Inject 
    MApplication application 

    @Execute 
    public void execute(@Named(IServiceConstants.ACTIVE_SHELL) Shell shell) { 

     NewFromDirectoryDialog dialog = new NewFromDirectoryDialog(shell); 
     dialog.create(); 
     IEclipseContext activeWindowContext = application.getContext().getActiveChild(); 
     if (dialog.open() == Window.OK) { 
      activeWindowContext.activate(); 
      String sourceDir = dialog.getSourceDir(); 
      String classDir = dialog.getClassDir(); 
      TreeViewer tv = ((ExplorerView)fPartService.findPart("bc.part.explorer").getObject()).getTreeViewer(); 
     } 
    } 

Сохранить контекст до и восстановления после dialog.open().