0

最近、自分のアプリケーションの1つでGWTを使い始めました。UiBinderの使用法について疑問がありました。クラスで(および同様に.ui.xmlでも)@UiField属性を宣言した場合、そのタイプの新しいオブジェクトを作成して、同じ参照に割り当てることはできますか?コンストラクタ?

たとえば、私のui.xmlファイルの中央にPlotWidgetがあるDockLayoutPanelがあるとします。

public class PlotWidget extends Composite {

    @UiField (provided = true)
    SimplePlot plot;

    public Constructor() {
        plot = new SimplePlot(someArgument1, someArgument2);
    }

    // some method
    public doSomething() {
        // Is this valid?
        plot = new SimplePlot(someArgument3, someArgument4);    
    }
}

プロットはDockLayoutPanelに接続されたままですか?そうでない場合、上記のような新しいオブジェクトを作成する必要がある機能をどのように実現しますか?

任意のポインタをいただければ幸いです。

4

2 に答える 2

1

そのような場合、ウィジェットを変更するためにコンテナーを使用します。

public class PlotWidget {

    @UiField
    SimplePanel plotContainer;

    public Constructor() {
        plotContainer.setWidget(new SimplePlot(someArgument1, someArgument2));
    }

    public doSomething() {
        plotContainer.setWidget(new SimplePlot(someArgument3, someArgument4));    
    }
}

ただし、プロット フィールドにイベント ハンドラー (@UiHandler アノテーションによって提供される) があると、正しく動作しません。

于 2012-07-23T10:47:01.077 に答える
0

サンプルコードに欠けているのは、 のような ui バインダーの作成呼び出しですinitWidget(uiBinder.createAndBindUi(this));。これはplotContainer、コンストラクターの ui フィールドの初期化後に呼び出されます。新しいインスタンスを新しいインスタンスに再割り当てするSimplePlotと、DockLayoutPanel にアタッチされず、既存のインスタンスを何らかの方法で置き換えた場合は、ハンドラーも再アタッチする必要があります。

解決策は、新しい SimplePlot インスタンスを作成するか、作成する代わりに、SimplePlot のメソッド呼び出しを介して引数を設定することです。ただし、SimplePlot を作成する唯一の方法がコンストラクターを使用する場合で、実装を制御できない場合は、SimplePlot を作成してハンドラーをアタッチし、その新しいウィジェットsetWidgetをsinicynが説明するようにPlotWidget。

于 2012-07-23T11:28:33.553 に答える