用于GWT的标题框架面板(使用FIELDSET和LEGEND html标签)

时间:2009-10-06 06:57:29

标签: html gwt event-handling fieldset legend

我正在尝试在GWT中创建一个标题边框,结果如下:

Legend+Fieldset

这可以使用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,或者需要手动重新路由事件,还是有其他方法?

2 个答案:

答案 0 :(得分:17)

我认为您正在寻找CaptionPanel

  

一个面板,其内容包含在边框的左上角显示的标题边框中。这是fieldset HTML元素的实现。

答案 1 :(得分:1)

我认为这里的问题是您只需致电DOM.appendChild - 这不会导致TitledPanel采用Widget。正常的做法是你扩展Composite然后调用initWidget(Widget widget) - 在它调用widget.setParent(this);的引擎盖内,这反过来使父母采用这个小部件并将其附加到浏览器的文档。但是,com.google.gwt.user.client.ui.Widget.setParent(Widget)只是包可见,因此您无法从代码中调用它(例如,DOM.appendChild之后)。

我建议阅读Widget Best Practices / Widget Building,特别是自己清理和/或查看一些GWT Widgets的源代码,以了解GWT如何看待自定义小部件创建

而且,正如罗伯特suggested,CaptionPanel是更安全的路线:)