2010-01-14 4 views
5

Stellen Sie sich das folgende einfache Widget mit UiBinder erstellt:Wie importierte CSS-Stile in GWT richtig verwenden

<!DOCTYPE ui:UiBinder SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent"> 
<ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder" 
    xmlns:g="urn:import:com.google.gwt.user.client.ui"> 

    <ui:style type="my.package.Widget1.Widget1Style"> 
     .childWidgetStyle { 
      border-width: 1px; 
      border-style: dotted; 
     } 
    </ui:style> 

    <g:TextArea styleName="{style.childWidgetStyle}"/> 
</ui:UiBinder> 

package my.package; 
// some imports here 

public class Widget1 extends Composite { 
    private static Widget1UiBinder uiBinder = GWT.create(Widget1UiBinder.class); 

    interface Widget1UiBinder extends UiBinder<Widget, Widget1> { 
    } 

    public interface Widget1Style extends CssResource { 
     String childWidgetStyle(); 
    } 

    @UiField 
    TextArea textArea; 

    public Widget1(String text) { 
     initWidget(uiBinder.createAndBindUi(this)); 
     textArea.setText(text); 
    } 
} 

als Sie dieses einfache Widget in einem anderen (Eltern) verwenden Widget Sie erstellt:

<!DOCTYPE ui:UiBinder SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent"> 
<ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder" 
    xmlns:g="urn:import:com.google.gwt.user.client.ui"> 

    <ui:style> 
     .parentWidgetStyle .childWidgetStyle { 
      margin-bottom: 10px; 
     } 
    </ui:style> 
    <g:VerticalPanel ui:field="listPanel" addStyleNames="{style.parentWidgetStyle}" /> 
</ui:UiBinder> 

package my.package; 
// imports go here 
public class ParentWidget extends Composite { 
    private static ParentWidgetUiBinder uiBinder = GWT.create(ParentWidgetUiBinder.class); 

    interface ParentWidgetUiBinder extends UiBinder<Widget, ParentWidget> { 
    } 

    @UiField 
    VerticalPanel listPanel; 

    public ParentWidget(final String... texts) { 
     initWidget(uiBinder.createAndBindUi(this)); 
     for (final String text : texts) { 
      final Widget1 entry = new Widget1(text); 
      listPanel.add(entry); 
     } 
    } 
} 

Was Sie erreichen möchten, ist es, einen gewissen Spielraum zwischen den Widget1-Einträgen in der Liste mit CSS zu bekommen. Aber das wird nicht funktionieren. Weil GWT die CSS-Namen verschleiern wird. Und der verdeckte Name für .childWidgetStyle in ParentWidget wird sich von .childWidgetStyle in Widget1 unterscheiden. Die sich ergebende CSS sieht etwa wie folgt aus:

.G1unc9fbE { 
    border-style:dotted; 
    border-width:1px; 
} 
.G1unc9fbBB .G1unc9fDa { 
    margin-bottom:10px; 
} 

So ist die Randeinstellung wird nicht gelten. Wie mache ich das richtig?

+0

andere Für dazu nehmen, siehe [die Entsendung mich mit den verfügbaren Online-Ressourcen nach einem langen, frustrierenden Kampf erstellt] (http: // www.steveclaflin.com/blog-stuff/gwt/CssResourceImports.html) – stevec

Antwort

4

Der Trick ist, die CSS-Klasse Namen in ParentWidget zu importieren:

<!DOCTYPE ui:UiBinder SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent"> 
<ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder" 
    xmlns:g="urn:import:com.google.gwt.user.client.ui"> 

    <ui:style import="my.widget.Widget1.Widget1Style"> 
     .parentWidgetStyle .Widget1Style-childWidgetStyle { 
      margin-bottom: 10px; 
     } 
    </ui:style> 
    <g:VerticalPanel addStyleNames="{style.parentWidgetStyle}" /> 
</ui:UiBinder> 

Der wichtigste Teil ist, wenn Sie nicht ImportedWithPrefix Anmerkung GWT verwenden Sie werden die importierten Stil Namen mit dem Klassennamen der Ressource Präfix die css-Klasse ist in. So childWidgetStyle wird .Widget1Style-childWidgetStyle.

(edit:. Entfernte Teil etwa @Shared folgende Kommentare und documentation)

+0

Eduard - Warum ist die @Shared Annotation erforderlich? Laut den Dokumenten ist es nicht erforderlich: http://code.google.com/webtoolkit/doc/latest/DevGuideClientBundle.html#Shared_scopes – logan

+0

@logan - Dieser Link scheint anzugeben, dass die gemeinsame Superklasse die Shared-Annotation haben muss: "Wenn verschiedene CSS-Typen verschleierte Klassennamen gemeinsam verwenden müssen, müssen die CssResource-Subtypen, denen sie zugeordnet sind, einen gemeinsamen Supertyp verwenden, der Accessoren für diese Namen definiert und die Shared-Annotation hat." –

+0

@Stembrain - Ich stimme zu, eine gemeinsame Superklasse muss die '@ Shared' Annotation haben. Das heißt, in dieser Antwort gibt es keine gemeinsame Oberklasse. Dies ist ein Beispiel für "Importierte Bereiche", nicht "Gemeinsame Bereiche", und ist meines Erachtens eine falsche Verwendung der Anmerkung. – logan