2011-05-06 24 views
0

对不起,如果这已经回答过。我做了一点搜索,发现什么都不能解决我的问题。我使用Spring Roo创建了一个应用程序,然后转换为GWT应用程序。 Spring Roo生成的所有代码仅适用于CRUD。现在我想添加约会日历,所以我需要移动到另一个页面。 从来就将此代码添加到
ScaffoldDesktopShell.java()GWT RootLayoutPanel - 问题渲染页从第二个到第一个(第一个正常工作)

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

回答

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

ScaffoldDesktopApp.init()proxyListPlacePicker生成与apropriate ProxyListPlace地方改变事件。

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

ApplicationMasterActivities类通过检查包含在ProxyListPlace对象EntityProxy类型创建在主控区域适当活性的影响。

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

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

在导航菜单中创建要输出meaningfull名字,他们正在使用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扩展复合机具活动{

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 { 
} 

在一个

@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创建SomeActivity或覆盖在派生类中getTopPlaces。在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

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

设置正确的菜单呈现文本。

+0

谢谢贾尼斯的回复。我还没准备好做这些改变。 MVP对我来说是一种新方法。我将首先探索活动和场所的gwt帮助,然后我会再次回到我的项目。如果你可以在修改后发布一些代码,那就太棒了。如果我得到正确的答案,我会在这里发布。 – Martinho 2011-05-11 15:53:43

+0

谢谢janis.abele。你拯救了我的一天。感谢您解释并提供了代码。 您的回复非常有帮助,我相信这可以帮助其他同事解决同样的问题。 – Martinho 2011-05-12 11:52:13

+1

@Martinho从你的例子中有另一个细节 - NovoPainel去整页,所以导航似乎嵌套,但这种情况在[GWT 2.1活动 - 嵌套? YAGNI!](http://tbroyer.posterous.com/gwt-21-activities-nesting-yagni) – abele 2011-05-12 12:00:11

1

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

Roo生成一个GWT 2.1应用程序;所有的导航代码都建立在活动和场所之上。我提出这个问题的原因是,这听起来像是你试图让许多这个导航框架实现你自己的。我不确定,但我相信你的问题来自MVP代码因此而感到困惑的事实。

我的建议是首先通过上面链接的GWT MVP文章。完全分开Roo,因为Roo生成的应用程序更复杂。一旦你有了一个好的处理方法,回到Roo生成的应用程序,它可能会更有意义。

+0

嗨彼得。我想你是正确的。我从Roo开始,花了很多时间去适应,我认为这是一个很棒的工具。现在我想我什么都没学到。 MVP概念是一个好方法,但我认为我没有时间把它们放在一起(标准Google项目和Roo生成的代码中的MVP)。如果你能指出我正确的方向,例如向我展示一些代码和我可以改变的地方。 – Martinho 2011-05-07 13:27:48

+1

Spring Roo生成许多文件,其中大多数不需要它们。在不更改任何其他文件的情况下修改是非常困难的。我有10个实体,每个实体都有一堆文件和文件夹。我失去了 – Martinho 2011-05-07 14:03:56

+0

到目前为止,根据我的经验,我使用Roo来管理GWT项目的服务器组件。它在删除与数据库相关的编码方面做得很好。不幸的是,GWT“Scaffold”应用程序非常复杂 - 目的是可以将其用作基本的数据浏览器,但是您将构建自己的UI。您仍然可以重复使用很多Scaffold应用程序,但是没有一种简单的方法可以根据特定目的对其进行修改......它始终是一个类似数据浏览器的应用程序。 – 2011-05-07 15:33:48

0

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

显示第一页使用

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

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

RootPanel.get("seconddivtag_id2").add(Panel2); 
相关问题