2009-10-06 13 views
6

estoy tratando de crear un marco titulado frontera en GWT, que se traduce en lo siguiente:panel de marco para GWT (el uso de etiquetas de campos y html LEYENDA)

Legend+Fieldset

Esto se puede hacer utilizando HTML fieldset y etiquetas de leyenda, como

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

Quiero crear un widget personalizado en GWT que implemente eso. Logré hacer eso, pero el problema es que los eventos que suceden dentro del widget (botón, clic, etc.) no se activan aunque he agregado el controlador.

Mi aplicación del widget es el siguiente:

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

¿Es necesario extender compuesto, o la necesidad de desviar manualmente los eventos, o hay otras maneras?

Respuesta

17

creo que estás buscando CaptionPanel:

Un panel que envuelve su contenido en una frontera con una leyenda que aparece en la esquina superior izquierda de la frontera. Esta es una implementación del elemento HTML fieldset.

1

Creo que el problema aquí es que se acaba de llamar DOM.appendChild - esto no causa la TitledPanel adoptar el Widget. El curso de acción normal es que extienda Composite y luego llame al initWidget(Widget widget) - dentro del cofre llama al widget.setParent(this);, lo que a su vez hace que el padre adopte este widget y lo adjunte al documento del navegador. Sin embargo, com.google.gwt.user.client.ui.Widget.setParent (Widget) solo está visible en el paquete, por lo que no puede llamarlo desde su código (después de, por ejemplo, DOM.appendChild).

me gustaría recomendar la lectura de Widget Best Practices/Widget Building, especialmente el limpiar tú mismo y/o mirar el código fuente de algunos widgets de GWT, para tener una idea de cómo el GWT ve la creación widget personalizado.

Y, como Robert suggested, CaptionPanel es la ruta más segura :)

Cuestiones relacionadas