1

UIBinderとMVPを使用してGWTウィジェットを作成しています。ウィジェットのデフォルトのスタイルは、TheWidgetView.ui.xmlで定義されています。

<ui:style type="com.widgetlib.spinner.display.TheWidgetView.MyStyle">
    .textbox {
        border: 1px solid #red;
    }
    .important {
        font-weight: bold;
    }
</ui:style>

ウィジェットのCssResourceインターフェースは、TheWidgetView.javaで定義されています。

public class TheWidgetView extends HorizontalPanel implements TheWidgetPresenter.Display {
    // ... some code
    @UiField MyStyle style;
    public interface MyStyle extends CssResource {
        String textbox();
        String important();
    }
    // ... more code
}

このウィジェットのコンシューマーがウィジェットのスタイルの一部をカスタマイズできるようにし、これをMyExample.ui.xmlに含めることができるようにしたいと思います。

<ui:style type="com.consumer.MyExample.MyStyle">
    .textbox {
        border: 2px solid #black;
    }
</ui:style>

そしてこれは彼らのMyExample.javaです:

public class MyExample extends Composite {
    // ... some code
    @UiField MyStyle style;
    interface MyStyle extends TheWidgetView.MyStyle{
        String textbox();
    }
    // ... more code
}

ウィジェットにデフォルトのスタイルを設定できるが、ウィジェットのコンシューマーがそれらの1つをオーバーライドできる方法はありますか?インターフェイスがTheWidgetView.MyStyleを拡張する場合、ウィジェットコンシューマーのは、その親インターフェイスにリストされているすべてのスタイルを定義する必要があります。一部のウィジェットライブラリでは、ウィジェットのコンストラクターがClientBundleをパラメーターとして取り込んでいるのを見てきました。これは、CssResourceに適用できると思います。ただし、UIBinderによって呼び出されるコンストラクターでこのスタイルオブジェクトをどのように渡すかはわかりません。

よろしくお願いします!

4

1 に答える 1

0

私は自分のアプリケーションをスキン可能にするために似たようなもので遊んでいます。まず、セルウィジェットのソースコードを確認します。リソースをコンストラクターとして使用しているように見えますが、提供されていない場合は、GWT.create(Resources.class)を使用してリソースを作成するコンストラクターもあります。UIBinderにこのテンプレートを使用することについての質問に関しては、ここで言及されている3つのオプションがあります。ただし、UIBinder内でスタイルを定義しようとすると、鶏肉と卵子の問題が発生する可能性があります。

他のコードで発生している問題は、uibinderが親のcssを参照しない独自のリソースバンドルを作成するため、スタイルの2つの異なる実装であるということです。3つの解決策があります:

1)ucssをuiバインダーファイルから独自のファイルに切り離し、ui:withを提供されたフィールドまたはuifactoryと組み合わせて使用​​し、ソースを合成できる独自のリソースバインドを使用してスタイルを挿入します(つまり、@ Source({DEFAULT_CSS 、"myCss.css"}))。

2)他のオプションは、生成されたコードを確認し、それらが使用している構文を使用してuibinderファイル内のcssを参照することですが、克服しなければならない2つの問題があります。鶏が先か卵が先かという問題とGoogleの事実です。あなたに言わずにこれを変えて、あなたのものを壊すことができます。これが私のファイルの1つから生成されたクライアントバンドルの例です:

@Source("uibinder:com.foo.gwt.client.workspace.select.SelectWorkspaceViewImpl_SelectWorkspaceViewImplUiBinderImpl_GenCss_style.css")
SelectWorkspaceViewImpl_SelectWorkspaceViewImplUiBinderImpl_GenCss_style style();

3)最後の解決策は、デフォルトのスタイルを置き換えるために遅延バインディングを使用することです。

<replace-with class="com.foo.gwt.laf.mpe.resource.CellTableResources">
    <when-type-is class="com.google.gwt.user.cellview.client.CellTable.Resources" />
    <when-property-is name="laf" value="MPE" />
</replace-with>
于 2011-11-14T23:08:07.063 に答える