2010-07-22 16 views
0

J'ai un widget (Main.java) qui encapsule funcionality et implémente le modèle Async Provider pour le découpage de code. De plus, j'utilise le pattern Prefetching pour que le navigateur télécharge le code immédiatement après le chargement de l'écran de bienvenue.Comportement étrange de partage de code GWT dans IE8

Le problème se pose dans IE8. Si j'utilise le widget principal sans faire de prélecture, tout va bien. Cependant, si je fais la prélecture en premier, puis que j'essaie d'utiliser le widget Main, le navigateur affiche uniquement le panneau central du DockLayoutPanel utilisé par le widget Principal. Dans Firefox, tout fonctionne bien.

Voici le code:

//BugTest.java 
package com.bugtest.clearadd.client; 

import com.google.gwt.core.client.EntryPoint; 
import com.google.gwt.event.dom.client.ClickEvent; 
import com.google.gwt.event.dom.client.ClickHandler; 
import com.google.gwt.user.client.rpc.AsyncCallback; 
import com.google.gwt.user.client.ui.Button; 
import com.google.gwt.user.client.ui.FlowPanel; 
import com.google.gwt.user.client.ui.Label; 
import com.google.gwt.user.client.ui.PopupPanel; 
import com.google.gwt.user.client.ui.RootLayoutPanel; 
import com.google.gwt.user.client.ui.RootPanel; 

    public class BugTest implements EntryPoint { 

    @Override 
    public void onModuleLoad() { 
     Button prefetchButton = new Button("Prefetch!"); 
     prefetchButton.addClickHandler(new ClickHandler() { 

      @Override 
      public void onClick(ClickEvent event) { 
       Main.getInstance(new AsyncCallback<Main>() { 

        @Override 
        public void onSuccess(Main result) { 
         PopupPanel popupPanel = new PopupPanel(true); 
         popupPanel 
           .setWidget(new Label("Prefetching finished!")); 
         popupPanel.center(); 
        } 

        @Override 
        public void onFailure(Throwable caught) { 
         // TODO Auto-generated method stub 

        } 
       }); 
      } 
     }); 

     Button switchButton = new Button("Switch!"); 
     switchButton.addClickHandler(new ClickHandler() { 

      @Override 
      public void onClick(ClickEvent event) { 
       Main.getInstance(new AsyncCallback<Main>() { 

        @Override 
        public void onSuccess(Main result) { 
         RootPanel.get().clear(); 
         RootLayoutPanel.get().add(result); 
        } 

        @Override 
        public void onFailure(Throwable caught) { 
         // TODO Auto-generated method stub 

        } 
       }); 
      } 
     }); 

     FlowPanel flowPanel = new FlowPanel(); 
     flowPanel.add(new Label("Bug test!")); 
     flowPanel.add(prefetchButton); 
     flowPanel.add(switchButton); 

     RootPanel.get().add(flowPanel); 
    } 

} 

//Main.java 
package com.bugtest.clearadd.client; 

import com.google.gwt.core.client.GWT; 
import com.google.gwt.core.client.RunAsyncCallback; 
import com.google.gwt.dom.client.Style.Unit; 
import com.google.gwt.user.client.rpc.AsyncCallback; 
import com.google.gwt.user.client.ui.DockLayoutPanel; 
import com.google.gwt.user.client.ui.Label; 
import com.google.gwt.user.client.ui.ResizeComposite; 

public class Main extends ResizeComposite { 

    private static Main instance = null; 

    public static void getInstance(final AsyncCallback<Main> callback) { 
     GWT.runAsync(new RunAsyncCallback() { 

      @Override 
      public void onSuccess() { 
       if (instance == null) { 
        instance = new Main(); 
       } 
       callback.onSuccess(instance); 
      } 

      @Override 
      public void onFailure(Throwable reason) { 
       callback.onFailure(reason); 
      } 
     }); 
    } 

    private Main() { 
     DockLayoutPanel dockLayoutPanel = new DockLayoutPanel(Unit.EM); 
     dockLayoutPanel.addNorth(new Label("North!"), 7); 
     dockLayoutPanel.addWest(new Label("West!"), 15); 
     dockLayoutPanel.add(new Label("Center! :D")); 
     initWidget(dockLayoutPanel); 
    } 

} 

Est-ce que quelqu'un sait ce que ça pourrait être? Merci d'avance.

EDIT: J'ai remarqué que si je change les unités DockLayoutPanel en PX, tout fonctionne correctement. Est-ce un bug ou il me manque quelque chose? Merci encore. : P

Répondre

0

J'ai réalisé que ce problème n'avait rien à voir avec le découpage de code. J'ai supprimé la fonction GWT.runAsync et le même problème apparaît toujours. Le problème est plus susceptible d'être lié à DockLayoutPanel, à l'unité EM et au modèle de conception. Ce problème doit donc être signalé dans une autre question. Plus précisément, j'ai changé le motif Async Provider pour un motif Singleton et le problème persiste. Et encore, si je change les unités de EM à PX, le problème semble résolu. Merci quand même!

EDIT: Je posté les nouvelles caractéristiques de ce problème dans ce post: https://stackoverflow.com/questions/3313981/gwt-ie8-problem-with-composite-over-docklayoutpanel-the-unit-em-and-the-single