2010-03-12 3 views
4

Je voulais créer un widget GWT en utilisant UiBinder. Je fis donc:GWT UiBinder ne charge pas la feuille de style

UserPanel.ui.xml comme ceci:

<?xml version="1.0" encoding="UTF-8"?> 
<ui:UiBinder xmlns:ui='urn:ui:com.google.gwt.uibinder' 
    xmlns:g='urn:import:com.google.gwt.user.client.ui'> 

    <ui:with field="res" type="com.example.resources.UserPanelResources" /> 

    <g:VerticalPanel styleNames='{res.userpanel.main}'> 
     ...some other widgets go here... 
    </g:VerticalPanel> 
</ui:UiBinder> 

UserPanel.css comme ceci:

.main { 
    width: 1000px; 
    background-color: #f9f9fa; 
    padding: 15px 10px; 
    font-family: "Georgia"; 
} 

et UserPanelResources.java comme:

public interface UserPanelResources extends ClientBundle { 
    public interface UserPanelCss extends CssResource { 
     String main(); 
    } 

    @Source("css/userpanel.css") 
    UserPanelCss userpanel(); 
} 

Tous les fichiers et les paquets sont à leur place, car tout compile bien. Mais quand j'exécute le mode Développement, les styles ne sont pas appliqués! J'ai essayé beaucoup d'approches différentes, mais ça ne marche toujours pas. Ce que j'ai remarqué, c'est que dans le HTML, VerticalPanel reçoit le nom de classe obfusqué par GWT, mais le CSS n'est pas envoyé au navigateur - en fait, le GWT ne le demande même pas.

Ai-je raté quelque chose?

Répondre

7

Ok, j'ai trouvé la solution.

Il s'est avéré être le UserPanelCss non injecté.

La solution était UserPanelResources, java:

public interface UserPanelResources extends ClientBundle { 
    public final static UserPanelResources INSTANCE = GWT.create(UserPanelResources.class) 

    public interface UserPanelCss extends CssResource { 
     String main(); 
    } 

    @Source("css/userpanel.css") 
    UserPanelCss userpanel(); 
} 

Et dans la classe UserPanel.java il suffit d'ajouter:

static { 
    UserPanelResources.INSTANCE.userpanel().ensureInjected(); 
} 
3

J'ai eu le même problème pour une ressource CSS que je n'utilise dans mon fichier UiBinder.

J'ai ajouté un hack à mon constructeur de widget pour le réparer. Voici l'équivalent en utilisant les noms de classe ci-dessus:

 
    @Inject 
    UserPanel(UserPanelResources resources) { 
    resources.userpanel().ensureInjected(); 
    initWidget(BINDER.createAndBindUi(this)); 
    ... 
    }