您必须与Roo生成的架构集成,以便您仍然可以从Roo脚手架中受益。
Roo生成的代码隐藏了_Roo_Gwt
类中的大部分行为,这是因为GWT doesn’t currently support ITDs。因此,必须通过覆盖_Roo_Gwt
类中的方法在派生类中进行更改。
要浏览应用程序,请使用Places,ActivityMapper和ActivitiManager(您可以在@Thomas Broyer posterous和GWT help上找到好阅读。
如果你看看ScaffoldDesktopShell.ui.xml
- 页面分为三个主要区域。
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));
设置正确的菜单呈现文本。
谢谢贾尼斯的回复。我还没准备好做这些改变。 MVP对我来说是一种新方法。我将首先探索活动和场所的gwt帮助,然后我会再次回到我的项目。如果你可以在修改后发布一些代码,那就太棒了。如果我得到正确的答案,我会在这里发布。 – Martinho 2011-05-11 15:53:43
谢谢janis.abele。你拯救了我的一天。感谢您解释并提供了代码。 您的回复非常有帮助,我相信这可以帮助其他同事解决同样的问题。 – Martinho 2011-05-12 11:52:13
@Martinho从你的例子中有另一个细节 - NovoPainel去整页,所以导航似乎嵌套,但这种情况在[GWT 2.1活动 - 嵌套? YAGNI!](http://tbroyer.posterous.com/gwt-21-activities-nesting-yagni) – abele 2011-05-12 12:00:11