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

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

于 2009-10-06T10:34:28.440 回答
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,尤其是Clean up after yourself和/或查看一些 GWT Widgets 的源代码,以了解 GWT 如何看待自定义小部件的创建。

而且,正如罗伯特所建议的那样,CaptionPanel 是更安全的路线:)

于 2009-10-06T12:04:11.550 回答