2009-10-06 5 views
6

Je suis en train de créer un cadre de bordure intitulé GWT, qui se traduit par ceci:panneau cadre Intitulée pour GWT (en utilisant les balises html FIELDSET et LEGEND)

Legend+Fieldset

Cela peut être fait en utilisant HTML fieldset et les balises de légende, telles que

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

Je souhaite créer un widget personnalisé dans GWT qui l'implémente. J'ai réussi à le faire, mais le problème est que les événements qui se produisent à l'intérieur du widget (bouton, etc.) ne sont pas déclenchés bien que j'aie ajouté le gestionnaire.

Ma mise en œuvre du widget est la suivante:

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

Ai-je besoin d'étendre Composite, ou besoin de rediriger manuellement les événements, ou est-il d'autres moyens?

Répondre

17

Je pense que vous êtes à la recherche CaptionPanel:

Un panneau qui enveloppe son contenu dans une bordure avec une légende qui apparaît dans le coin supérieur gauche de la frontière. Ceci est une implémentation de l'élément HTML fieldset.

1

Je pense que le problème ici est que vous appelez juste DOM.appendChild - cela ne cause pas le TitledPanel d'adopter le Widget. Le processus normal consiste à étendre Composite puis à appeler le initWidget(Widget widget) - à l'intérieur du capot, il appelle widget.setParent(this);, ce qui fait que le parent adopte ce widget et l'attache au document du navigateur. Toutefois, com.google.gwt.user.client.ui.Widget.setParent (Widget) est uniquement visible dans le package. Vous ne pouvez donc pas l'appeler à partir de votre code (par exemple, DOM.appendChild).

Je recommande la lecture Widget Best Practices/Widget Building, en particulier le nettoyer après vous et/ou regarder le code source pour certains widgets GWT, pour obtenir l'idée comment le GWT voit la création personnalisée widgets.

Et, comme Robert suggested, CaptionPanel est la route la plus sûre :)

Questions connexes