2016-06-15 3 views
1

을 FormEditor을 추가하는 동안 정말 기본 FormEditorFormPage :에StackOverflowError가 내가 가진 FormPage가

java.lang.StackOverflowError의 :

public class CustomFieldSetVersionEditor extends FormEditor { 

    @Override 
    protected void addPages() { 
     try { 
      addPage(new MyFormPage(this), getEditorInput()); 
     } catch (final PartInitException ex) { 
      ex.printStackTrace(); 
     } 
    } 

    @Override 
    public void doSave(final IProgressMonitor monitor) {} 

    @Override 
    public void doSaveAs() {} 

    @Override 
    public boolean isSaveAsAllowed() { return false; } 
} 

class MyFormPage extends FormPage { 

    public MyFormPage(final FormEditor editor) { 
     super(editor, "id", "Title"); 
    } 

    @Override 
    protected void createFormContent(final IManagedForm managedForm) { } 

} 

이 인정 하듯이 복잡하고 이국적인 사용 사례는 다음과 같은 예외를 제공합니다 org.eclipse.swt.widgets.Widget.getData (Widget.java:525) at org.eclipse.ui.part.MultiPageEditorPart.getEditor (MultiPageEditorPart.java:599) at org.eclipse.ui.part.MultiPageEditorPar t.getActiveEditor (MultiPageEditorPart.java:523) at org.eclipse.ui.forms.editor.FormAdive.getActiveEditor (FormEditor.java:430) at org.eclipse.ui.forms.editor.FormEditor $ FormEditorSelectionProvider.getSelection FormEditor.java:84) org.eclipse.ui.forms.editor.FormEditor $ FormEditorSelectionProvider.getSelection에서 org.eclipse.ui.forms.editor.FormEditor $ FormEditorSelectionProvider.getSelection (FormEditor.java:89) 에서 (FormEditor. 자바 : org.eclipse.ui.forms.editor.FormEditor $ FormEditorSelectionProvider.getSelection (FormEditor.java:89) 89) ... 그러나

, 내가 addPage(IFormPage) 대신사용하는 경우그것은 작동합니다. 이 문제에 대한 "버그"보고서도 있습니다 : Bug 283039 (아무런 이유가 없습니다. 이유가 없습니다).

버그 인 경우 논의 할 필요는 없지만 알고 싶은 것은 : FormPageFormEditor에 추가하고 IEditorInput을 정의하는 방법은 무엇입니까?

답변

1

FormPage이 두 번째로 초기화되고 IEditorSite이 주 FormEditor과 같습니다. 따라서 동일한 선택 공급자가 FormPage의 주 편집기로 사용되며이 선택 공급자는이를 예상하지 않고 루프를 만듭니다.

당신은 FormPageisEditor 방법을 재정 의하여 두 번째 초기화를 중지하고 true를 반환 할 수 있습니다

@Override 
public boolean isEditor() { 
    return true; 
} 

은 또한만큼 (당신이 addPage(IFormPage) 전화를 사용하는 경우 페이지가 여전히 편집기 입력으로 초기화되어 있습니다 isEditorfalse을 반환합니다.