2009-10-06 69 views
6

我试图创建一个GWT题为边框,从而导致此:题为帧面板GWT(使用FIELDSET和LEGEND html标签)

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()); 
} 
} 

我是否需要延长复合,或需要手动重新路由的事件,还是有别的办法吗?

回答

17

我认为你正在寻找CaptionPanel

与出现在边框的左上角的标题包装在边境的内容的面板。这是字段集HTML元素的实现。

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部件的源代码,以获得GWT如何看待自定义窗口小部件创建的想法。

而且,作为Robert suggested,CaptionPanel是更安全的路线:)