7

Google マップと同様に、任意の HTML を含むマップ ポップアップを作成できる GWT ライブラリ (gwt-openlayers) を使用しています。GWT ボタン ウィジェットを含めるには、この HTML が必要です。

次のように、オンザフライでいくつかの HTML 要素を作成しています。

Element outerDiv = DOM.createDiv();
outerDiv.getStyle().setOverflow(Overflow.HIDDEN);
outerDiv.getStyle().setWidth(100, Unit.PCT);
outerDiv.appendChild(new HTML(mapPOI.getHtmlDetails()).getElement());
Button popupButton = new Button("View Property");
popupButton.getElement().getStyle().setFloat(com.google.gwt.dom.client.Style.Float.RIGHT);
outerDiv.appendChild(popupButton.getElement());

次に、これらの要素のソース HTML を呼び出して取得します。

String src = outerDiv.toString();

このhtmlをマップマーカーに挿入します。これで、マップ マーカーにボタンを含むコンテンツが正常に表示されます。ただし、ボタンはどのイベントにも応答しません。私が収集できることから、これはボタンの onAttach() メソッドが呼び出されないためです。

これを行うより良い方法はありますか?

ありがとう、

ジョン

~~~~編集~~~~

私は現在、これを行う新しい方法を試しています。これは、他の同様の投稿を見ると受け入れられている方法のようです。

まず、divを作成しています:

String divId = "popup-" + ref;
String innerHTML = "<div id=\"" +divId + "\"></div>";

次に、これをマップ ポップアップに追加して表示します (DOM に追加します)。ポップアップが表示された後、次のように Element を取得し、その周りに HTMLPanel をラップしようとしています。

Element element = Document.get().getElementById(divId);
HTMLPanel popupHTML = HTMLPanel.wrap(element);

div 要素が正常に取得されました。ただし、HTMLPanel.wrap(element);完了しません。この理由は、次のアサーションを含むをwrap(..)呼び出すためです。RootPanel.detachOnWindowClose(Widget widget)

assert !widgetsToDetach.contains(widget) : "detachOnUnload() called twice "
    + "for the same widget";
assert !isElementChildOfWidget(widget.getElement()) : "A widget that has "
    + "an existing parent widget may not be added to the detach list";

いくつかのブレークポイントを入れましたが、2 番目のアサーションが失敗しているようです!

なぜこれが当てはまるのか、誰にも分かりますか?このアサーションに失敗すると、本当にメソッドの完全な失敗 (戻りなし) になるのでしょうか?

4

5 に答える 5

2

あなたは次のようなものを試すかもしれません

RootPanel.get("idOfYourMapMarker").add(popupButton);

RootPanel.get()を参照してください。

残念ながら、RootPanels はAbsolutePanelsレイアウトにはあまり適していませんが、追加する単純なボタンがあれば機能します。LayoutPanel を提供するものを試すこともできRootLayoutPanelます (物事をただ流したいだけの場合もあまり良くありません)。レイアウトを行うコンテナー ウィジェットを作成し、それを RootPanel に追加することになる場合があります。

于 2012-07-13T15:38:26.940 に答える
0

私はかつて同様の問題を抱えていました。MapWidget次のように gwt-openlayer を使用できます。

private MapWidget createMapWidget() {
    final MapOptions defaultMapOptions = new MapOptions();
    defaultMapOptions.setDisplayProjection(DEFAULT_PROJECTION);
    defaultMapOptions.setNumZoomLevels(TOTAL_ZOOM_LEVELS);

    MapWidget mapWidget = new MapWidget(MAP_WIDGET_WIDTH, MAP_WIDGET_HEIGHT, defaultMapOptions);

    map = mapWidget.getMap();

    return mapWidget;
}

そして、垂直または水平の任意のパネルに追加します。

MapWidget mapWgt = createMapWidget();

VerticalPanel mainPanel = new VerticalPanel();
mainPanel.add(mapWgt);
...
... add whatever you want
...

最後に、作成したPanel(MapWidgetと gwt ウィジェットを含む)を に追加できPopupPanelます。また、ハンドラーを gwt ボタンに追加できるようになりました。

于 2014-07-21T10:31:11.197 に答える
0

要素を追加しましたが、実際の G​​WT ウィジェットの階層も維持する必要があります。

これを行うきれいな方法はわかりませんが、jQuery のようなものを使用して、ID によってボタンを取得し、元のクリック ハンドラーを呼び出すクリック ハンドラーを追加することができます。

private static native void registerEvents(String buttonId, MyClass instance)/*-{
    var $ = $wnd.$;

    //check click
    $('#'+buttonId).live('click', function(e) {
        e.preventDefault();
        instance.@com.package.MyClass::handleButtonClick(Lcom/google/gwt/event/dom/client/ClickEvent;)(null);
    });
}-*/;

onAttach またはコンストラクターでこの registerEvents() を呼び出します。

于 2012-07-13T18:27:07.463 に答える