2009-10-06 5 views
6

Ich versuche, einen Titel Grenze Frame in GWT zu schaffen, die dazu führt:Betitelt Rahmenplatte für GWT (mit FIELDSET und LEGEND HTML-Tags)

Legend+Fieldset

Dies kann mit Hilfe getan werden HTML Fieldset B.

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

Ich möchte ein benutzerdefiniertes Widget in GWT erstellen, das das implementiert. Ich habe es geschafft, aber das Problem ist, dass Ereignisse, die innerhalb des Widgets (Knopfklick usw.) passieren, nicht ausgelöst werden, obwohl ich den Handler hinzugefügt habe.

Meine Implementierung des Widgets ist wie folgt:

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

Muss ich Composite-verlängern müssen, oder müssen manuell die Ereignisse umleiten, oder gibt es andere Möglichkeiten?

Antwort

17

Ich glaube, Sie suchen CaptionPanel:

Ein Panel, das seinen Inhalt in einem Rahmen mit einer Beschriftung wickelt, die in der oberen linken Ecke der Grenze erscheint. Dies ist eine Implementierung des Fieldset-HTML-Elements.

1

Ich denke, das Problem hier ist, dass man DOM.appendChild nur nennen - dies verursacht nicht die TitledPanel die Widget zu übernehmen. Die normale Vorgehensweise ist, dass Sie Composite verlängern und dann initWidget(Widget widget) anrufen - innerhalb der Haube ruft es widget.setParent(this); an, die wiederum das Elternteil dazu bringt, dieses Widget zu übernehmen und es an das Dokument des Browsers anzuhängen. Com.google.gwt.user.client.ui.Widget.setParent (Widget) ist jedoch nur im Paket sichtbar, so dass Sie es nicht aus Ihrem Code heraus aufrufen können (z. B. nach DOM.appendChild).

würde ich empfehlen, Widget Best Practices/Widget Building Lesen, vor allem die Abgleich nach sich und/oder Blick auf den Quellcode für einige GWT Widgets, um die Idee zu bekommen, wie das GWT benutzerdefinierte Widget Schöpfung sieht.

Und als Robert suggested, ist CaptionPanel der sicherere Weg :)