GWT RootLayoutPanel - Problem rendering page from second to first (first works fine)

只愿长相守 提交于 2019-12-13 05:27:02

问题


Sorry if this was already answered before. I did a little searching and found nothing that could solve my problem. I created an application with Spring Roo, then converted to a GWT app. All the code generated by Spring Roo is only for CRUD. Now i want to add a Calendar for make appointments, so i need to move to another page. I´ve added this code to
ScaffoldDesktopShell.java()

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

Then created a new UIbinder, called it NovoPainel() and added this code:

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

    botao.addClickHandler(new ClickHandler() {

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

Everything goes fine moving from my root panel to NovoPainel, but when i need to go back to rootPanel the page doesn´t render correctly. EX: Doesn´t show ** ValuePicker ** to click on left panel and render on center.

This is my RootPanel

and this image is when navigate from rootPanel to NovoPainel

and finally this one is returning from NovoPainel to RootPanel


回答1:


You have to integrate with Roo generated architecture so that you can still benefit from Roo scaffolding.

Roo generated code hides most of behavior in _Roo_Gwt classes and it is because GWT doesn’t currently support ITDs. So changes have to be made in derived classes by overriding methods from _Roo_Gwt class.

To navigate application use Places, ActivityMapper and ActivitiManager (you can find good read on @Thomas Broyer posterous and GWT help).

If you take a look in ScaffoldDesktopShell.ui.xml - page is devided in three main areas.

ApplicationMasterActivities class is responsible for master area.
masterActivityManager.setDisplay(shell.getMasterPanel());

proxyListPlacePicker in ScaffoldDesktopApp.init() generates place change event with apropriate ProxyListPlace.

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

ApplicationMasterActivities class creates appropriate Activity in Master area by checking EntityProxy type contained in ProxyListPlace object.

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

Navigation is created by listing all EntityProxy's in 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;
}

To output meaningfull name in navigation menu they are rendered using 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());
}

So you have to create new Activity. public class SomeActivity extends Composite implements 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> 

Create appropriate EntityProxy. It is only to obey ProxyListPlace mechanism.

public interface SomeEntityProxy extends EntityProxy {
}

Create SomeActivity in 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;
}

Add place to navigation in ScaffoldApp or override getTopPlaces in derived class.

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

Set correct menu rendering text in 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;
}

Code in GitHub.




回答2:


GWT 2.1 introduced new classes that implements the Model-View-Places pattern (MVP). This pattern (and the GWT 2.1 concepts) are heavily based on best practices from developers who have build scalable GWT-based applications, so many people are migrating in this direction.

Roo generates a GWT 2.1 application; all of its navigational code is built on top of Activities and Places. The reason I bring this up is it sounds like you are attempting to side-step a lot of this navigational framework to implement your own. I'm not sure, but I believe your problem is coming from the fact that the MVP code is getting confused as a result.

My recommendation would be to work through the GWT MVP article linked above first. Do it completely separate of Roo, because the application that Roo generates is more complex. Once you have a good handle on it, go back through the Roo-generated application and it will likely make more sense.




回答3:


You can create two div tags in your Porject.html file respectively with id firstdivtag_id1 and seconddivtag_id2.

Display first page by using

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

And then to switch over to another panel use

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


来源:https://stackoverflow.com/questions/5917703/gwt-rootlayoutpanel-problem-rendering-page-from-second-to-first-first-works-f

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!