2010-07-22 3 views
0

У меня есть виджет (Main.java), который инкапсулирует funcionality и реализует шаблон провайдера Async для разделения кода. Кроме того, я использую шаблон Prefetching, чтобы браузер загружал код по ошибке после загрузки экрана приветствия.Код GWT, разбивающий странное поведение в IE8

Проблема возникает в IE8. Если я использую главный виджет, не делая предварительной выборки, все в порядке. Однако, если я сначала сделаю предварительную выборку, а затем попытаюсь использовать главный виджет te, то браузер отобразит только центральную панель DockLayoutPanel, используемую главным виджетами. В Firefox все работает нормально.

Вот код:

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

} 

Кто-нибудь знает, что это может быть? Заранее спасибо.

EDIT: Я заметил, что если я изменю единицы DockLayoutPanel на PX, все будет хорошо. Это ошибка, или я чего-то не хватает? Еще раз спасибо. : P

ответ

0

Я понял, что этот вопрос не имеет ничего общего с разделением кода. Я удалил функцию GWT.runAsync, и эта же проблема все еще появляется. Проблема, скорее всего, связана с DockLayoutPanel, единицей EM и шаблоном проектирования, поэтому эта проблема должна быть опубликована в другом вопросе. В частности, я изменил шаблон провайдера Async для шаблона Singleton, и проблема все еще проявляется. И снова, если я изменю единицы измерения от EM до PX, проблема кажется решена. Спасибо в любом случае!

EDIT: Я разместил новые характеристики этой проблемы в этом посте: https://stackoverflow.com/questions/3313981/gwt-ie8-problem-with-composite-over-docklayoutpanel-the-unit-em-and-the-single

Смежные вопросы