GWT код расщепляет странное поведение в IE8 - PullRequest
0 голосов
/ 23 июля 2010

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

Проблема возникает в IE8. Если я использую основной виджет без предварительной выборки, все в порядке. Однако, если я сначала выполню предварительную выборку, а затем попытаюсь использовать главный виджет, браузер показывает только центральную панель 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);
    }

}

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

РЕДАКТИРОВАТЬ: я заметил, что если я изменяю блоки DockLayoutPanel на PX, все работает нормально. Это ошибка или я что-то упустил? Еще раз спасибо. : Р

1 Ответ

0 голосов
/ 23 июля 2010

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

РЕДАКТИРОВАТЬ: я опубликовал новые характеристики этой проблемы в этом сообщении: https://stackoverflow.com/questions/3313981/gwt-ie8-problem-with-composite-over-docklayoutpanel-the-unit-em-and-the-single

...