Google フォームの作成ページに非常によく似たページを作成しようとしています。

これは、GWT MVP フレームワーク (Places and Activities) と Editors を使用してモデル化しようとしている方法です。
CreateFormActivity (アクティビティとプレゼンター)
CreateFormView (ビュー用のインターフェイス、ネストされた Presenter インターフェイスを使用)
CreateFormViewImpl (CreateFormView および Editor< FormProxy > を実装します)
CreateFormViewImpl には、次のサブエディターがあります。
- テキストボックスのタイトル
 - テキストボックスの説明
 - QuestionListEditor 質問リスト
 
QuestionListEditorは IsEditor< ListEditor< QuestionProxy, QuestionEditor>> を実装します
QuestionEditorは Editor < QuestionProxy> を実装します QuestionEditor には次のサブエディタがあります。
- テキストボックスの質問のタイトル
 - テキストボックスのヘルプテキスト
 - ValueListBox questionType
 - 以下の各質問タイプのオプションの副編集者。
 
各質問タイプのエディター:
TextQuestionEditor
ParagraphTextQuestionEditor
複数選択問題エディタ
チェックボックスQuestionEditor
ListQuestionEditor
ScaleQuestionEditor
GridQuestionEditor
具体的な質問:
- フォームから質問を追加/削除する正しい方法は何ですか。 (フォローアップの質問を参照)
 - 質問の種類ごとにエディターを作成するにはどうすればよいですか? questionType 値の変更を聞いてみましたが、その後どうすればよいかわかりません。(BobVが回答)
 - 各質問タイプ固有のエディターは、optionalFieldEditor を使用してラッパーにする必要がありますか? 一度に使用できるのは の 1 つだけです。(BobVが回答)
 - オブジェクト階層の奥深くにあるオブジェクトの作成/削除を最適に管理する方法。例) 質問番号 3 の選択式問題の解答を指定する。(フォローアップの質問を参照)
 - OptionalFieldEditor エディターを使用して ListEditor をラップできますか? (BobVが回答)
 
回答に基づく実装
質問エディター
public class QuestionDataEditor extends Composite implements
CompositeEditor<QuestionDataProxy, QuestionDataProxy, Editor<QuestionDataProxy>>,
LeafValueEditor<QuestionDataProxy>, HasRequestContext<QuestionDataProxy> {
interface Binder extends UiBinder<Widget, QuestionDataEditor> {}
private CompositeEditor.EditorChain<QuestionDataProxy, Editor<QuestionDataProxy>> chain;
private QuestionBaseDataEditor subEditor = null;
private QuestionDataProxy currentValue = null;
@UiField
SimplePanel container;
@UiField(provided = true)
@Path("dataType")
ValueListBox<QuestionType> dataType = new ValueListBox<QuestionType>(new Renderer<QuestionType>() {
    @Override
    public String render(final QuestionType object) {
        return object == null ? "" : object.toString();
    }
    @Override
    public void render(final QuestionType object, final Appendable appendable) throws IOException {
        if (object != null) {
            appendable.append(object.toString());
        }
    }
});
private RequestContext ctx;
public QuestionDataEditor() {
    initWidget(GWT.<Binder> create(Binder.class).createAndBindUi(this));
    dataType.setValue(QuestionType.BooleanQuestionType, true);
    dataType.setAcceptableValues(Arrays.asList(QuestionType.values()));
    /*
     * The type drop-down UI element is an implementation detail of the
     * CompositeEditor. When a question type is selected, the editor will
     * call EditorChain.attach() with an instance of a QuestionData subtype
     * and the type-specific sub-Editor.
     */
    dataType.addValueChangeHandler(new ValueChangeHandler<QuestionType>() {
        @Override
        public void onValueChange(final ValueChangeEvent<QuestionType> event) {
            QuestionDataProxy value;
            switch (event.getValue()) {
            case MultiChoiceQuestionData:
                value = ctx.create(QuestionMultiChoiceDataProxy.class);
                setValue(value);
                break;
            case BooleanQuestionData:
            default:
                final QuestionNumberDataProxy value2 = ctx.create(BooleanQuestionDataProxy.class);
                value2.setPrompt("this value doesn't show up");
                setValue(value2);
                break;
            }
        }
    });
}
/*
 * The only thing that calls createEditorForTraversal() is the PathCollector
 * which is used by RequestFactoryEditorDriver.getPaths().
 * 
 * My recommendation is to always return a trivial instance of your question
 * type editor and know that you may have to amend the value returned by
 * getPaths()
 */
@Override
public Editor<QuestionDataProxy> createEditorForTraversal() {
    return new QuestionNumberDataEditor();
}
@Override
public void flush() {
    //XXX this doesn't work, no data is returned
    currentValue = chain.getValue(subEditor);
}
/**
 * Returns an empty string because there is only ever one sub-editor used.
 */
@Override
public String getPathElement(final Editor<QuestionDataProxy> subEditor) {
    return "";
}
@Override
public QuestionDataProxy getValue() {
    return currentValue;
}
@Override
public void onPropertyChange(final String... paths) {
}
@Override
public void setDelegate(final EditorDelegate<QuestionDataProxy> delegate) {
}
@Override
public void setEditorChain(final EditorChain<QuestionDataProxy, Editor<QuestionDataProxy>> chain) {
    this.chain = chain;
}
@Override
public void setRequestContext(final RequestContext ctx) {
    this.ctx = ctx;
}
/*
 * The implementation of CompositeEditor.setValue() just creates the
 * type-specific sub-Editor and calls EditorChain.attach().
 */
@Override
public void setValue(final QuestionDataProxy value) {
    // if (currentValue != null && value == null) {
    chain.detach(subEditor);
    // }
    QuestionType type = null;
    if (value instanceof QuestionMultiChoiceDataProxy) {
        if (((QuestionMultiChoiceDataProxy) value).getCustomList() == null) {
            ((QuestionMultiChoiceDataProxy) value).setCustomList(new ArrayList<CustomListItemProxy>());
        }
        type = QuestionType.CustomList;
        subEditor = new QuestionMultipleChoiceDataEditor();
    } else {
        type = QuestionType.BooleanQuestionType;
        subEditor = new BooleanQuestionDataEditor();
    }
    subEditor.setRequestContext(ctx);
    currentValue = value;
    container.clear();
    if (value != null) {
        dataType.setValue(type, false);
        container.add(subEditor);
        chain.attach(value, subEditor);
    }
}
}
質問ベース データ エディタ
public interface QuestionBaseDataEditor extends HasRequestContext<QuestionDataProxy>,                         IsWidget {
}
サブタイプの例
public class BooleanQuestionDataEditor extends Composite implements QuestionBaseDataEditor {
interface Binder extends UiBinder<Widget, BooleanQuestionDataEditor> {}
@Path("prompt")
@UiField
TextBox prompt = new TextBox();
public QuestionNumberDataEditor() {
    initWidget(GWT.<Binder> create(Binder.class).createAndBindUi(this));
}
@Override
public void setRequestContext(final RequestContext ctx) {
}
}
残っている唯一の問題は、QuestionData サブタイプ固有のデータが表示またはフラッシュされていないことです。私が使用しているエディターのセットアップに関係していると思います。
たとえば、プロンプトの値BooleanQuestionDataEditorは設定もフラッシュもされず、rpc ペイロードでは null です。
私の推測では、QuestionDataEditor は LeafValueEditor を実装しているため、サブエディターがアタッチされていても、ドライバーはサブエディターにアクセスしません。
助けてくれる人に感謝します!!!