0

私は、顧客のライセンスの編集を処理するこのListEditorを持っています。私CustomerEditorの場合LicensesEditor、これはタイプのパスライセンスにバインドされていますList<License>>

顧客(1)->(多くの)ライセンス(java.util.List)

現在、検証ルールでは、顧客ごとに少なくとも1つのライセンスが必要であると規定されています。制約違反は完全に機能します。しかし、ListEditorにHasEditorErrorsを実装するにはどうすればよいですか...独自のエラーマーキングを提供したいと思います。

HasEditorErrors <T>のジェネリックパラメーターTにどのタイプを注入しますか?

public interface HasEditorErrors<T> extends Editor<T>

ListEditorの署名は次のとおりです...

public class LicensesEditor extends Composite implements IsEditor<ListEditor<License, LicenseInListEditor>>

HasEditorErrors<List<License>>実行時にエラーが発生する実装を試みました:

[デバッグ][klawtapp]-ライセンスへの降順[エラー][klawtapp]-プロキシタイプjava.util.Listのパスエディターのゲッターが見つかりませんでした

実装すればHasEditorErrors<LicensesEditor>

[エラー][klawtapp]プロキシタイプcom.klawt.screen.ui.customers.LicensesEditorでパスエディターのゲッターが見つかりませんでした

実装されたインターフェイスとしてHasEditorErrorsに疑問符を付けると、コンパイル時エラーが発生します。

タイプLicensesEditorは、HasEditorErrorsを拡張または実装できません。スーパータイプはワイルドカードLicensesEditor.javaを指定できません

誰か?

更新、以下の完全なコード:

public class LicensesEditor extends Composite implements IsEditor<ListEditor<License, LicenseInListEditor>> {

    @UiField
    Image validationErrorIcon;

    interface LicensesEditorUiBinder extends UiBinder<Widget, LicensesEditor> {
    }

    private static LicensesEditorUiBinder uiBinder = GWT.create(LicensesEditorUiBinder.class);

    @UiField
    VerticalPanel container;

    ListEditor<License, LicenseInListEditor> editor;

    public LicensesEditor() {
        initWidget(uiBinder.createAndBindUi(this));
        editor = ListEditor.of(new LicenseInListEditorSource());
        clearErrors();
    }

    @Override
    public ListEditor<License, LicenseInListEditor> asEditor() {
        return editor;
    }

    public void addLicense(License emailAddress) {
        editor.getList().add(emailAddress);
        if (emailAddress.getAdministrator()) {
            setPrimary(editor.getList().size() - 1);
        }
    }

    public void remove(int index) {
        editor.getList().remove(index);
    }

    public void update(int index, License emailAddress) {
        editor.getList().remove(index);
        editor.getList().add(index, emailAddress);
    }

    /**
     * make the phonenumber at the index the primary phonenumber and the other
     * phone numbers not primary.
     * 
     * @param index
     */
    public void setPrimary(int index) {
        int loop = 0;

        for (License emailAddress : Collections.unmodifiableList(editor.getList())) {
            emailAddress.setAdministrator(index == loop);
            update(loop, emailAddress);
            loop++;
        }
    }

    private class LicenseInListEditorSource extends EditorSource<LicenseInListEditor> {

        @Override
        public LicenseInListEditor create(final int index) {
            LicenseInListEditor editor = new LicenseInListEditor();
            editor.addDeleteHandler(new ListEditorDeleteEventHandler() {
                @Override
                public void onEditorEvent(ListEditorDeleteEvent event) {
                    remove(index);
                }
            });
            editor.addUpdateHandler(new EditorUpdateEventHandler() {
                @Override
                public void onEditorUpdate(EditorUpdateEvent event) {
                    License emailAddress = (License) event.getUpdated();
                    update(index, emailAddress);
                    if (emailAddress.getAdministrator()) {
                        setPrimary(index);
                    }
                }
            });
            container.insert(editor, index);
            updateOddEven();
            return editor;
        }

        @Override
        public void dispose(LicenseInListEditor subEditor) {
            container.remove(subEditor);
            updateOddEven();
        }

        @Override
        public void setIndex(LicenseInListEditor editor, int index) {
            container.insert(editor, index);
            updateOddEven();
        }

        public void updateOddEven() {
            for (int widgetIndex = 0; widgetIndex < container.getWidgetCount(); widgetIndex++) {
                container.getWidget(widgetIndex).setStyleName(KlawtResources.INSTANCE.form().listEditorEven(),
                        (widgetIndex % 2 == 0));
                container.getWidget(widgetIndex).setStyleName(KlawtResources.INSTANCE.form().listEditorOdd(),
                        (widgetIndex % 2 == 1));
            }
        }

    }

    // @Override
    // public void showErrors(List<EditorError> errors) {
    // StringBuilder sb = new StringBuilder();
    // int errorCount = 0;
    // for (EditorError editorError : errors) {
    // if (errorCount > 0) {
    // sb.append("\n");
    // }
    // errorCount++;
    // sb.append(editorError.getMessage());
    // }
    // if (errorCount == 0) {
    // clearErrors();
    // } else {
    // container.setStyleName(KlawtResources.INSTANCE.form().formError(), true);
    // validationErrorIcon.setVisible(true);
    // validationErrorIcon.setTitle(sb.toString());
    // }
    // }

    private void clearErrors() {
        container.setStyleName(KlawtResources.INSTANCE.form().formError(), false);
        validationErrorIcon.setVisible(false);
        validationErrorIcon.setTitle("");
    }

}
4

1 に答える 1

3

T問題ではなく、混合とマッチングEditorでありIsEditor、(私が思うに-タイプdecls以上を投稿せずに)いくつかの内部(つまり、あなたが呼んだと思うメンバーLicensesEditorのアクセス修飾子)と組み合わせるとです。ListEditoreditor

インターフェースは「IsEditor<E>私自身はエディターではありませんが、提供できます」と言うために使用され、実装Editorする非プライベートメンバーは無視されますが、フレームワークは引き続きの非プライベートエディターに分類されEます。(私が思うに)あなたのLicensesEditor内部には実際には非プライベートの編集者メンバーがいるので、

それで、これはあなたをどこに残しますか?私にとって理にかなっていると思われるいくつかの選択肢:

  • IsEditorを実装できるように、使用を停止しますHasEditorErrors。代わりに、make LicensesEditor extends Composite implements Editor<List<Licenses>>, HasEditorErrors<List<Licenses>>(技術的には最初のEditorものは2番目のものでカバーされていますが、読みやすさには役立ちます)。ここでもListEditorメンバーが必要です(ほぼ確実に現在すでに持っているため)が、@Path("")エディター全体が取得したのと同じ値を編集する必要があることを示すために注釈を付けます。

  • を使用IsEditorしますが、両方で汎用にしHasEditorErrorsます。また、エラーをサポートListEditorするListEditorサブクラスを作成します。これにより、ラッピングクラスでHasEditorErrors拡張することができます。Compositeこれを好転させると、あなたは...

  • Compositeを拡張する代わりに、拡張しListEditorて実装します。これにより、最初のオプション(を削除することで実装を作成できます)IsWidgetと同じ効果が得られます。ここで、を呼び出す代わりに、ウィジェットへの参照を保持し、それを。に返します。LicensesEditorHasEditorErrorsIsEditor@PathComposite.initWidgetIsWidget.asWidget()

  • 最後に、何もしません。IsEditorJavadocから:

    タイプがEditorとIsEditorの両方を実装することは合法です。この場合、{@ link #asEditor()}から返されたエディターは、IsEditorインスタンスの共同エディターになります。

    これはLicensesEditor、有効なEditor - any non-private Editor member should either be changed to private or tagged with@Ignore`である必要があることを意味します。

于 2012-07-23T01:18:20.737 に答える