Панель рамок с заголовками для GWT (с использованием HTML-тегов FIELDSET и LEGEND)

Я пытаюсь создать рамку с названием в 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 или вручную перенаправлять события, или есть другие способы?


person Randy Sugianto 'Yuku'    schedule 06.10.2009    source источник


Ответы (2)


Я думаю, вы ищете CaptionPanel:

Панель, содержимое которой заключено в рамку с заголовком, который появляется в верхнем левом углу границы. Это реализация HTML-элемента fieldset.

person Robert Munteanu    schedule 06.10.2009

Я думаю, что проблема здесь в том, что вы просто вызываете DOM.appendChild - это не заставляет TitledPanel принимать Widget. Обычный порядок действий заключается в том, что вы расширяете Composite, а затем вызываете initWidget(Widget widget) - внутри капюшона он вызывает widget.setParent(this);, что, в свою очередь, заставляет родителя принять этот виджет и прикрепить его к документу браузера. Однако com.google.gwt.user.client.ui.Widget.setParent(Widget) виден только пакету, поэтому вы не можете вызывать его из своего кода (например, после DOM.appendChild).

Я рекомендую прочитать Лучшие практики использования виджетов / Создание виджетов, особенно Убрать за собой и/или просмотреть исходный код некоторых виджетов GWT, чтобы понять, как GWT воспринимает создание пользовательских виджетов.

И, как предложил Роберт < /a>, CaptionPanel — более безопасный путь :)

person Igor Klimer    schedule 06.10.2009