6

GWT でタイトル付きのボーダー フレームを作成しようとしていますが、その結果、次のようになります。

凡例+フィールドセット

これは、次のような HTML フィールドセットと凡例タグを使用して実行できます。

<fieldset> 
    <legend>Connection parameters</legend>
    ... the rest ...
</fieldset>

それを実装するカスタム ウィジェットを GWT で作成したいと考えています。なんとかできたのですが、ハンドラーを追加したのに、ウィジェット内で発生するイベント(ボタンクリックなど)が発生しないという問題があります。

私のウィジェットの実装は次のとおりです。

public class TitledPanel extends Widget {
private Element legend;
private Widget content = null;

public TitledPanel() {
    Element fieldset = DOM.createFieldSet();
    legend = DOM.createLegend();
    DOM.appendChild(fieldset, legend);
    setElement(fieldset);
}

public TitledPanel(String title) {
    this();
    setTitle(title);
}

@Override
public String getTitle() {
    return DOM.getInnerHTML(legend);
}

@Override
public void setTitle(String html) {
    DOM.setInnerHTML(legend, html);
}

public Widget getContent() {
    return content;
}

public void setContent(Widget content) {
    if (this.content != null) {
        DOM.removeChild(getElement(), this.content.getElement());
    }

    this.content = content;

    DOM.appendChild(getElement(), content.getElement());
}
}

Composite を拡張する必要がありますか、またはイベントを手動で再ルーティングする必要がありますか? または他の方法はありますか?

4

2 に答える 2

17

私はあなたがCaptionPanelを探していると思います:

境界線の左上隅に表示されるキャプションを使用して、その内容を境界線で囲むパネル。これは、フィールドセットHTML要素の実装です。

于 2009-10-06T10:34:28.440 に答える
1

ここでの問題は、単に呼び出すことだと思います。これにより、が を採用することDOM.appendChildはありません。通常のアクション コースは、拡張してから呼び出すことです- 内部で呼び出されます。これにより、親がこのウィジェットを採用し、ブラウザーのドキュメントにアタッチします。ただし、com.google.gwt.user.client.ui.Widget.setParent(Widget) はパッケージからのみ表示されるため、コードから呼び出すことはできません (たとえば、 の後)。TitledPanelWidgetCompositeinitWidget(Widget widget)widget.setParent(this);DOM.appendChild

Widget Best Practices / Widget Building、特にClean up after yourselfを読んだり、GWT ウィジェットのソース コードを調べたりして、GWT がカスタム ウィジェットの作成をどのように認識しているかを理解することをお勧めします。

そして、Robertが示唆したように、CaptionPanel はより安全なルートです :)

于 2009-10-06T12:04:11.550 に答える