2009-12-21 20 views
16

Ich versuche, ein einfaches Layout unter GWT 2.0 mit UiBinder arbeiten. Das Layout, das ich versuchen möchte, ist eines, das Java BorderLayout nachahmt, wo Sie verschiedene Felder in den Richtungen Norden, Süden, Osten, Westen und Zentrum angeben können; dafür benutze ich DockLayoutPanel. Ich möchte eine Kopf- und Fußzeile bekommen, beide mit fester Breite. Der verbleibende Darstellungsbereich würde von dem Widget eingenommen, das dem DockLayoutPanel-Center-Slot zugewiesen ist.Wie Layout Widgets mit DockLayoutPanel und UiBinder in GWT 2.0?

Die aktuelle .ui.xml Datei, die ich habe ist:

<g:DockLayoutPanel unit='EM'> 
    <g:north size='2'> 
     <g:HTML>HEADER</g:HTML> 
    </g:north> 

    <g:south size='2'> 
     <g:HTML>FOOTER</g:HTML> 
    </g:south> 

    <g:center> 
     <g:HTML> 
      <div id='loginform'>Hello!</div> 
     </g:HTML> 
    </g:center> 
</g:DockLayoutPanel> 

Der Browser rendert nur HEADER in der linken oberen Ecke. Wie kann ich das Layout erreichen, nach dem ich suche? Es scheint, dass es mehr CSS gibt, die Sie kennen müssen, bevor Sie GWT-Layout-Panels verwenden können, aber das verhindert den Zweck, die Benutzeroberfläche damit zu erstellen.

Antwort

29

Dies funktioniert für mich mit keinem der von RaphaelO vorgeschlagenen Hacks.

Das Javadoc-Beispiel auf dem DockLayoutPanel verwendet 192 als Breite für West. Das ist falsch - der Autor dachte wahrscheinlich, dass er PX benutzt, aber er benutzte EM. Wenn Sie also herauszoomen, sehen Sie, dass Center weit rechts liegt.

Haben Sie Ihren Standardmodus überprüft? Dies ist für das DockLayoutPanel erforderlich.

Vergessen Sie auch zu erwähnen, dass Sie RootLayoutPanel verwenden sollten, wenn Sie das DockLayout in Ihrer Einstiegsklasse hinzufügen - verwenden Sie nicht RootPanel.

+8

Ich wusste nicht, dass RootLayoutPanel existiert.Sobald ich es anstelle von RootPanel verwendet habe, funktioniert alles wie erwartet. – Cesar

+0

Erhalten Sie irgendwelche Fehler in der Konsole? Könnten Sie versuchen, das Javadocs-Beispiel (mit meiner Korrektur zur West-Breite) zu verwenden, um zu sehen, ob das funktioniert? –

+3

Es funktioniert jetzt. Keine Konsolenfehler Das Problem war, dass ich RootPanel anstelle von RootLayoutPanel verwendete. – Cesar

0

Ich habe versucht, Ihren Code-Block sowie die Beispiel-Block auf der Javadoc-Seite für DockLayoutPanel und ich bekomme ähnliche Ergebnisse. Es werden nur die Daten im Bereich North des DockLayoutPanel angezeigt. Jedoch wenn ich die Seite (mit Firefox und Safari auf Mac) suche, werden die anderen Elemente gefunden, aber sie zeigen nirgends. Scheint so, als könnte es einen Fehler mit diesem Panel und dem UiBinder geben.

+0

Danke, dass Sie es ausprobiert haben. Wenn Sie den Code überprüfen, der an den Client gesendet wird, können Sie sehen, dass die anderen Elemente vorhanden sind. Ich glaube, dass das CSS-Layout falsch ist, aber ich kenne nicht genug CSS, um es zu debuggen. – Cesar

+0

Ich stimme zu, dass es sich wahrscheinlich um einen CSS-Bug handelt, aber da keiner von uns wirklich etwas mit dem CSS gemacht hat (ich habe nur die Standardeinstellungen verwendet), scheint es sich um einen GWT-Fehler zu handeln. Vielleicht möchten Sie einen Fehler auf der GWT-Problemseite (http://code.google.com/p/google-web-toolkit/issues/list) öffnen. – Carnell

+0

Prüfen Sie @ RaphaelO's Antwort: macht einen Window.setMargin ("0"); vor dem Hinzufügen der DockLayoutPanel-Instanz zum RootLayoutPanel scheint der Trick zu tun. –

2

Die Verwendung der neu eingeführten Layout Panels ist in der Tat ziemlich verwirrend. Es gibt eine Möglichkeit, das Layout den gesamten Kundenbereich zu belegen. Es erfordert ein wenig Java-Code zusätzlich zur Datei ui.xml.

In Ihrer Entrypoint Klasse, eine UiBinder Definition mit einer Anmerkung zu der ui.xml Datei hinzufügen, die das Layout erklärt: es

@UiTemplate("LayoutDeclarationFile.ui.xml") 
interface DockLayoutUiBinder extends 
     UiBinder<DockLayoutPanel, TheEntryPointChildClass> { 
} 

private static DockLayoutUiBinder uiBinder = GWT 
     .create(DockLayoutUiBinder.class); 

in der onModuleLoad Funktion, instanziiert die UiBinder, ruft seine Wurzel und direkt hinzufügen zum DOM:

public void onModuleLoad() { 
    DockLayoutPanel layout = uiBinder.createAndBindUi(this); 
    // Make sure we use the whole client area 
    Window.setMargin("0px"); 

    // Add the panel to the DOM 
    RootLayoutPanel.get().add(layout); 
} 
+0

Dies half in meinem Fall, obwohl ich einige Anpassungen an meinem speziellen Fall vornehmen musste, da ich eine separate Klasse für meine UI-Komponente verwende. "Schnittstelle DockLayoutUiBinder erweitert {}" <- Mit "DockLayoutPanel" hier war der wirklich wichtige Teil, der in meinem Fall geholfen hat. – WhyNotHugo

Verwandte Themen