【问题标题】:StackOverflowError While Adding FormPage to FormEditor将 FormPage 添加到 FormEditor 时出现 StackOverflowError
【发布时间】:2016-10-16 09:21:34
【问题描述】:

我有一个非常基本的FormEditorFormPage

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) { }

}

这个公认的复杂而奇特的用例带来了以下例外:

java.lang.StackOverflowError 在 org.eclipse.swt.widgets.Widget.getData(Widget.java:525) 在 org.eclipse.ui.part.MultiPageEditorPart.getEditor(MultiPageEditorPart.java:599) 在 org.eclipse.ui.part.MultiPageEditorPart.getActiveEditor(MultiPageEditorPart.java:523) 在 org.eclipse.ui.forms.editor.FormEditor.getActiveEditor(FormEditor.java:430) 在 org.eclipse.ui.forms.editor.FormEditor$FormEditorSelectionProvider.getSelection(FormEditor.java:84) 在 org.eclipse.ui.forms.editor.FormEditor$FormEditorSelectionProvider.getSelection(FormEditor.java:89) 在 org.eclipse.ui.forms.editor.FormEditor$FormEditorSelectionProvider.getSelection(FormEditor.java:89) 在 org.eclipse.ui.forms.editor.FormEditor$FormEditorSelectionProvider.getSelection(FormEditor.java:89) ...

但是,如果我使用 addPage(IFormPage) 而不是 addPage(IEditorPart, IEditorInput) 它可以工作。这个问题甚至有一个“错误”报告:Bug 283039(这不是错误,因为......没有给出原因)。

我们不需要讨论这是否是一个错误,但我想知道的是:如何在仍定义 IEditorInput 的同时将 FormPage 添加到 FormEditor

【问题讨论】:

    标签: java eclipse-plugin


    【解决方案1】:

    FormPage 被初始化两次,第二次使用与主FormEditor 相同的IEditorSite。这会导致 FormPage 与主编辑器使用相同的选择提供程序,此选择提供程序不希望出现这种情况并进入循环。

    你可以通过重写FormPageisEditor方法停止第二次初始化并返回true:

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

    另请注意,如果您使用addPage(IFormPage) 调用,页面仍会使用编辑器输入进行初始化(只要isEditor 返回false)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-19
      • 2019-06-01
      • 2016-07-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-22
      • 1970-01-01
      相关资源
      最近更新 更多