GWT RootLayoutPanel - проблема рендеринга страницы со второй на первую (первая работает нормально) - PullRequest
0 голосов
/ 07 мая 2011

Извините, если на этот вопрос уже был дан ответ. Я немного искал и не нашел ничего, что могло бы решить мою проблему. Я создал приложение с помощью Spring Roo, а затем преобразовал его в приложение GWT. Весь код, сгенерированный Spring Roo, предназначен только для CRUD. Теперь я хочу добавить календарь для назначения встреч, поэтому мне нужно перейти на другую страницу. Я добавил этот код в
ScaffoldDesktopShell.java ()

    public ScaffoldDesktopShell() {
            initWidget(BINDER.createAndBindUi(this));
                startButton.addClickHandler(new ClickHandler() {
                    @Override
                    public void onClick(ClickEvent event) {
                        RootLayoutPanel.get().add(new NovoPainel());    
                    }
                });
            }
...    

Затем создал новый UIbinder, назвал его NovoPainel () и добавил этот код:

public NovoPainel() {
    initWidget(uiBinder.createAndBindUi(this));

    botao.addClickHandler(new ClickHandler() {

        @Override
        public void onClick(ClickEvent event) {             
            RootLayoutPanel.get().clear(); 
            RootLayoutPanel.get().add (new ScaffoldDesktopShell()); 
        }
    });
} 

Все идет хорошо, переходя от моей корневой панели к NovoPainel, но когда мне нужно вернуться к rootPanel, страница не отображается правильно. EX: не показывает ** ValuePicker ** для щелчка левой панели и рендеринга по центру.

Это моя RootPanel
http://www.flickr.com/photos/martinhoarantes/5694616812/in/photostream

и это изображение при переходе от rootPanel к NovoPainel

enter image description here

и, наконец, этот возвращается из Новопайнела в RootPanel
enter image description here

Ответы [ 3 ]

1 голос
/ 11 мая 2011

Вы должны интегрироваться с архитектурой, сгенерированной Roo, чтобы вы все еще могли извлечь выгоду из скаффолдинга Roo.

Код, сгенерированный Roo, скрывает большую часть поведения в классах _Roo_Gwt, и это потому, что GWTВ настоящее время поддержка ITDs .Поэтому в производные классы необходимо вносить изменения, переопределяя методы из _Roo_Gwt class.

Для навигации по приложению используйте Places, ActivityMapper и ActivitiManager (вы можете найти хорошее чтение на @Thomas Broyer posterous и GWT help ).

Если вы посмотрите на ScaffoldDesktopShell.ui.xml - страница разделена на три основные области.Roo Scaffolded Desktop Shell areas ApplicationMasterActivities класс отвечает за главную область.

masterActivityManager.setDisplay(shell.getMasterPanel());

proxyListPlacePicker в ScaffoldDesktopApp.init() генерирует событие изменения места с соответствующим ProxyListPlace.

public void onValueChange(ValueChangeEvent<ProxyListPlace> event) {
    placeController.goTo(event.getValue());
}

ApplicationMasterActivities class создает соответствующую активность в главной области, проверяя EntityProxy тип, содержащийся в ProxyListPlace объекте.

public Activity getActivity(Place place) {
    if (!(place instanceof ProxyListPlace)) {
        return null;
    }
    ProxyListPlace listPlace = (ProxyListPlace) place;
    return new ApplicationEntityTypesProcessor<Activity>() {

        @Override
        public void handlePet(PetProxy isNull) {
            setResult(new PetListActivity(requests, ScaffoldApp.isMobile() ? PetMobileListView.instance() : PetListView.instance(), placeController));
        }

        @Override
        public void handleOwner(OwnerProxy isNull) {
            setResult(new OwnerListActivity(requests, ScaffoldApp.isMobile() ? OwnerMobileListView.instance() : OwnerListView.instance(), placeController));
        }
    }.process(listPlace.getProxyClass());
}

Навигация создается путем перечисления всех EntityProxy в ScaffoldApp class

protected HashSet<ProxyListPlace> getTopPlaces() {
    Set<Class<? extends EntityProxy>> types = ApplicationEntityTypesProcessor.getAll();
    HashSet<ProxyListPlace> rtn = new HashSet<ProxyListPlace>(types.size());

    for (Class<? extends EntityProxy> type : types) {
        rtn.add(new ProxyListPlace(type));
    }

    return rtn;
}

Для вывода значимого имени в меню навигации они отображаются с использованием ApplicationListPlaceRenderer

public String render(ProxyListPlace object) {
    return new ApplicationEntityTypesProcessor<String>() {

        @Override
        public void handlePet(PetProxy isNull) {
            setResult("Pets");
        }

        @Override
        public void handleOwner(OwnerProxy isNull) {
            setResult("Owners");
        }
    }.process(object.getProxyClass());
}

Таким образом, вы должны создать новую активность.открытый класс SomeActivity расширяет Composite, реализует Activity {

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

interface SomeActivityUiBinder extends UiBinder<Widget, SomeActivity> {
}

private AcceptsOneWidget display;

public SomeActivity() {
    initWidget(uiBinder.createAndBindUi(this));
}

@Override
public String mayStop() {
    return null;
}

@Override
public void onCancel() {
    onStop();

}

@Override
public void onStop() {
    this.display.setWidget(null);
}

@Override
public void start(AcceptsOneWidget panel, EventBus eventBus) {
    this.display = panel;
    this.display.setWidget(this);
}

}


<!DOCTYPE ui:UiBinder SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent">
<ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder" xmlns:g="urn:import:com.google.gwt.user.client.ui">
   <g:HTMLPanel>
    Hello world!
   </g:HTMLPanel>
</ui:UiBinder> 

Создайте соответствующий EntityProxy.Это только для соблюдения механизма ProxyListPlace.

public interface SomeEntityProxy extends EntityProxy {
}

Создать SomeActivity в A

@Override
public Activity getActivity(Place place) {
    if (!(place instanceof ProxyListPlace)) {
        return null;
    }
    Activity activity = super.getActivity(place);
    if (activity == null) {
        ProxyListPlace listPlace = (ProxyListPlace) place;
            if (SomeEntityProxy.class.equals(listPlace.getProxyClass())) {
                 activity = new SomeActivity();
            }
     }
     return activity;
}

Добавить место для навигации в ScaffoldApp или переопределить getTopPlaces в производном классе.

rtn.add(new ProxyListPlace(SomeEntityProxy.class));

Установите правильный текст для отображения меню в ApplicationListPlaceRenderer

@Override
public String render(ProxyListPlace object) {
    String label = super.render(object);
    if(label == null) {
         if (SomeEntityProxy.class.equals(object.getProxyClass())) {
             label = "Some activity";
         }
     }
     return label;
}

Код в GitHub .

1 голос
/ 07 мая 2011

GWT 2.1 представил новые классы, которые реализуют шаблон Model-View-Places (MVP). Этот шаблон (и концепции GWT 2.1) в значительной степени основаны на передовом опыте разработчиков, создавших масштабируемые приложения на основе GWT, поэтому многие люди переходят в этом направлении.

Roo создает приложение GWT 2.1; весь его навигационный код построен поверх Активности и Мест. Причина, по которой я привел это, заключается в том, что вы пытаетесь обойти большую часть этой навигационной структуры, чтобы реализовать свою собственную. Я не уверен, но я считаю, что ваша проблема связана с тем, что в результате код MVP становится запутанным.

Я бы порекомендовал сначала проработать статью GWT MVP, связанную выше. Делайте это полностью отдельно от Roo, потому что приложение, которое генерирует Roo, является более сложным. Как только вы разберетесь с этим, вернитесь к сгенерированному Roo-приложению, и оно, вероятно, станет более понятным.

0 голосов
/ 11 мая 2011

Вы можете создать два тега div в файле Porject.html соответственно с идентификаторами firstdivtag_id1 и seconddivtag_id2.

Показать первую страницу с помощью

RootPanel.get("firstdivtag_id1").add(Panel1);

А затем, чтобы переключиться на другую панель, используйте

RootPanel.get("seconddivtag_id2").add(Panel2);
...