1

svg-images を gwt にロードする方法を知っています:最後の回答はこちら

これで、「SvgImage」クラスを作成しようとしています。gwt の image(url) のように動作するはずです。読み込み状態とは無関係に画像を追加でき、読み込みが完了するとすぐに画像が表示されます。これを達成する方法は?

または、一般的に、特定の URL を介してコンテンツをロードするウィジェットを作成するための良いアプローチは何ですか?

4

1 に答える 1

0

私はgwt画像ソースを少し掘り下げて、「replaceElement(Node)」があることを発見しました-特に画像用に作成された保護されたメソッドですが、このメソッドはに基づいています

Widget.getElement().replaceChild(newElement, oldElement);

これが私の完全な SvgWidget クラスです。

public class SvgWidget implements IsWidget {

    private String svgUrl;
    private ADBTexte strings;
    private IsWidget thisW;
    private Loading loadingWidget;

    @Inject
    private SvgWidget(@Assisted final String svgUrl, final ADBTexte strings, final Loading loadingWidget) {
        this.svgUrl = svgUrl;
        this.strings = strings;
        this.loadingWidget = loadingWidget;

    }

    @Override
    public Widget asWidget() {
        thisW = new SimplePanel(loadingWidget);
        RequestBuilder rB = new RequestBuilder(RequestBuilder.GET, svgUrl);
        rB.setCallback(new RequestCallback() {
            @Override
            public void onResponseReceived(final Request request, final Response response) {
                Widget result = new HTML(response.getText());
                thisW.asWidget()
                     .getElement()
                     .replaceChild(result.getElement(), thisW.asWidget().getElement().getChild(0));
            }

            @Override
            public void onError(final Request request, final Throwable exception) {
                Widget result = new Label(strings.chartError());
                thisW.asWidget()
                     .getElement()
                     .replaceChild(result.getElement(), thisW.asWidget().getElement().getChild(0));
                GWT.log("Error on loading chart: ", exception);

            }
        });
        try {
            rB.send();
        } catch (RequestException e) {
            Widget result = new Label(strings.chartError());
            thisW.asWidget().getElement().replaceChild(result.getElement(), thisW.asWidget().getElement().getChild(0));
            GWT.log("Error on sending request for chart: ", e);
        }

        return thisW.asWidget();
    }

    /**
     * Use this to get an instance of {@link SvgWidget}.
     * 
     */
    public interface Factory {
        /**
         * 
         * @param svgUrl
         *            url for svg graphic
         * @return instance of {@link SvgWidget} displaying the svg accessible via the given url
         */
        SvgWidget get(@Assisted String svgUrl);
    }

}

関連するものは asWidget() にあります。しかし、これが良い/最善の解決策であるかどうかはわかりません:

  • SimplePanel は適切なコンテナーですか (要素を置き換えるためのコンテナーのみが必要です)
  • おそらく HasLoadHandlers を実装する必要がありますか?!
  • ウィジェットは読み込み中のウィジェットを表示します - おそらくそれはより適切に配置されています
  • 他に考慮すべきことはありますか?

(依存性注入 (gin を使用) を知らない場合: すべての不明な注釈とファクトリ インターフェイスを無視してください)

于 2012-11-07T06:45:58.660 に答える