GWT RootLayoutPanel - 从第二个到第一个的问题呈现页面(第一个工作正常)

时间:2011-05-06 22:31:30

标签: java gwt spring-roo uibinder

很抱歉,如果之前已经回答过这个问题。我做了一点搜索,发现什么都不能解决我的问题。我用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

最后这一个从NovoPainel返回到RootPanel
enter image description here

3 个答案:

答案 0 :(得分:1)

GWT 2.1引入了implements the Model-View-Places模式(MVP)的新类。这种模式(以及GWT 2.1概念)主要基于构建可扩展的基于GWT的应用程序的开发人员的最佳实践,因此许多人正朝这个方向迁移。

Roo生成GWT 2.1应用程序;它的所有导航代码都建立在“活动和地点”之上。我提出这个问题的原因是听起来你正试图将这个导航框架放在一边以实现自己的框架。我不确定,但我相信你的问题是因为MVP代码因此而变得混乱。

我的建议是先完成上面链接的GWT MVP文章。完全将Roo分开,因为Roo生成的应用程序更复杂。一旦掌握了好处,就可以回过头来看看Roo生成的应用程序,它可能更有意义。

答案 1 :(得分:1)

您必须与Roo生成的架构集成,以便您仍然可以从Roo脚手架中受益。

Roo生成的代码隐藏了_Roo_Gwt类中的大多数行为,这是因为GWT doesn’t currently support ITDs。因此,必须通过覆盖_Roo_Gwt类的方法在派生类中进行更改。

要导航应用程序,请使用Places,ActivityMapper和ActivitiManager(您可以在@Thomas Broyer posterousGWT 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类通过检查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());
}

通过列出ScaffoldApp

中的所有EntityProxy来创建导航
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());
}

所以你必须创建新的Activity。 公共类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 {
}

在A

中创建SomeActivity
@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;
}

Code in GitHub

答案 2 :(得分:0)

您可以在Porject.html文件中分别使用id firstdivtag_id1和seconddivtag_id2创建两个div标签。

使用

显示第一页
RootPanel.get("firstdivtag_id1").add(Panel1);

然后切换到另一个面板使用

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