GXT之旅:第八章:Portal&Drag-Drop——项目使用Portal重构(1)
2012-04-23 14:16
477 查看
目前,我们的RSSReader项目里,使用的是ContentPanel容器和BorderLayout布局效果。接下来,我们要做稍微的调整,将ContentPanel替换为Portlet,
然后使用Portal去管理他们。
Portlet是一个非常理想的components,用来构成独立的,不受他人影响的用户接口。不仅仅可以统一的被Portal管理,我们还可以使用MVC,让Portal响应每一个Portlet的新建过程,并保证其独立性。
我们首先要做的是新增一个EventType(NewPortletCreated)到AppEvents类里。我们会用它来触发新建Portlet过程。
public static final EventType NewPortletCreated = new EventType();
新建类:PortalController extends Controller
package com.danielvaughan.rssreader.client.mvc.controllers; import com.extjs.gxt.ui.client.mvc.AppEvent; import com.extjs.gxt.ui.client.mvc.Controller; public class PortalController extends Controller { public PortalController() { } @Override public void handleEvent(AppEvent event) { } }
新建类:PortalView extends View
package com.danielvaughan.rssreader.client.mvc.views; import com.danielvaughan.rssreader.client.mvc.controllers.PortalController; import com.extjs.gxt.ui.client.mvc.AppEvent; import com.extjs.gxt.ui.client.mvc.View; public class PortalView extends View { public PortalView(PortalController controller) { super(controller); } @Override protected void handleEvent(AppEvent event) { } }
回到PortalController类,加入PortalView属性到此类里。并且Override initialize()方法
package com.danielvaughan.rssreader.client.mvc.controllers; import com.danielvaughan.rssreader.client.mvc.views.PortalView; import com.extjs.gxt.ui.client.mvc.AppEvent; import com.extjs.gxt.ui.client.mvc.Controller; public class PortalController extends Controller { private PortalView portalView; @Override public void initialize() { super.initialize(); portalView = new PortalView(this); } public PortalController() { } @Override public void handleEvent(AppEvent event) { } }
构造函数里,注册EventType——NewPortletCreated,Error
public PortalController() { registerEventTypes(AppEvents.NewPortletCreated); registerEventTypes(AppEvents.Error); }
下面处理handleEvent方法——有错误事件的时候,记录日志;其他情况,将事件转发到portalView
package com.danielvaughan.rssreader.client.mvc.controllers;
import com.danielvaughan.rssreader.client.mvc.events.AppEvents;
import com.danielvaughan.rssreader.client.mvc.views.PortalView;
import com.extjs.gxt.ui.client.event.EventType;
import com.extjs.gxt.ui.client.mvc.AppEvent;
import com.extjs.gxt.ui.client.mvc.Controller;
import com.google.gwt.core.client.GWT;
public class PortalController extends Controller {
private PortalView portalView;
@Override
public void initialize() {
super.initialize();
portalView = new PortalView(this);
}
public PortalController() { registerEventTypes(AppEvents.NewPortletCreated); registerEventTypes(AppEvents.Error); }
@Override
public void handleEvent(AppEvent event) {
EventType eventType = event.getType();
if (eventType.equals(AppEvents.Error)) {
GWT.log("Error", (Throwable) event.getData());
} else {
forwardToView(portalView, event);
}
}
}
接下来回到PortalView类里,新建一个属性——portal,并且是一个具有两列的portal
private final Portal portal = new Portal(2);
Override initialize()方法:设置两列的各自宽度;并且新建一个Viewport,在Viewport里加入portal
package com.danielvaughan.rssreader.client.mvc.views; import com.danielvaughan.rssreader.client.mvc.controllers.PortalController; import com.extjs.gxt.ui.client.mvc.AppEvent; import com.extjs.gxt.ui.client.mvc.View; import com.extjs.gxt.ui.client.widget.Viewport; import com.extjs.gxt.ui.client.widget.custom.Portal; import com.extjs.gxt.ui.client.widget.layout.FitLayout; import com.google.gwt.user.client.ui.RootPanel; public class PortalView extends View { private final Portal portal = new Portal(2); public PortalView(PortalController controller) { super(controller); } @Override protected void handleEvent(AppEvent event) { } @Override protected void initialize() { portal.setColumnWidth(0, 0.3); portal.setColumnWidth(1, 0.7); final Viewport viewport = new Viewport(); viewport.setLayout(new FitLayout()); viewport.add(portal); RootPanel.get().add(viewport); } }
当然handleEvent()方法要处理传入的NewPortletCreated事件。但是就现在而言,我们先不做处理。
@Override protected void handleEvent(AppEvent event) { EventType eventType = event.getType(); if (eventType.equals(AppEvents.NewPortletCreated)) { } }
最后,来到RSSReader类的onModuleLoad方法——去掉之前所有的代码,修改后的内码如下:
package com.danielvaughan.rssreader.client; import com.danielvaughan.rssreader.client.mvc.controllers.AppController; import com.danielvaughan.rssreader.client.mvc.controllers.FeedController; import com.danielvaughan.rssreader.client.mvc.controllers.ItemController; import com.danielvaughan.rssreader.client.mvc.controllers.NavController; import com.danielvaughan.rssreader.client.mvc.controllers.PortalController; import com.danielvaughan.rssreader.client.mvc.controllers.StatusController; import com.danielvaughan.rssreader.client.mvc.events.AppEvents; import com.danielvaughan.rssreader.client.services.FeedService; import com.danielvaughan.rssreader.client.services.FeedServiceAsync; import com.extjs.gxt.ui.client.Registry; import com.extjs.gxt.ui.client.mvc.Dispatcher; import com.google.gwt.core.client.EntryPoint; import com.google.gwt.core.client.GWT; /** * Entry point classes define <code>onModuleLoad()</code>. */ public class RSSReader implements EntryPoint { /** * This is the entry point method. */ @Override public void onModuleLoad() { // final FeedServiceAsync feedService = GWT.create(FeedService.class); // Registry.register(RSSReaderConstants.FEED_SERVICE, feedService); // Dispatcher dispatcher = Dispatcher.get(); // // dispatcher.addController(new AppController()); // dispatcher.addController(new NavController()); // dispatcher.addController(new FeedController()); // dispatcher.addController(new ItemController()); // // dispatcher.addController(new StatusController()); // // dispatcher.dispatch(AppEvents.Init); // dispatcher.dispatch(AppEvents.UIReady); final FeedServiceAsync feedService = GWT.create(FeedService.class); Registry.register(RSSReaderConstants.FEED_SERVICE, feedService); Dispatcher dispatcher = Dispatcher.get(); dispatcher.addController(new PortalController()); } }
相关文章推荐
- GXT之旅:第八章:Portal&Drag-Drop——项目使用Portal重构(2)
- GXT之旅:第八章:Portal&Drag-Drop——项目使用Portal重构(3)
- GXT之旅:第八章:Portal&Drag-Drop——项目使用Drag-Drop重构(2)
- GXT之旅:第八章:Portal&Drag-Drop——项目使用Drag-Drop重构(3)
- GXT之旅:第八章:Portal&Drag-Drop——项目使用Drag-Drop重构(1)
- GXT之旅:第八章:Portal&Drag-Drop——拖拽(Drag-Drop)基本介绍
- GXT之旅:第八章:Portal&Drag-Drop——Portal的基本介绍
- 使用HTML5的drag&drop做一个数独游戏
- 使用HTML5的drag&drop做一个数独游戏
- 使用ASP.NET Atlas实现拖放(Drag & Drop)效果
- Draggabilly – 轻松实现拖放功能(Drag & Drop)
- 使用VS2010在项目中编写C++头文现出"PCH 警告:标头停止点不能位于宏或#if块中"
- HTML5学习日记——拖(Drag)&放(Drop)
- HTML5高阶实例之Drag&Drop
- 项目实战①—高仿知乎日报(2)—>使用pullrefesh+Slidingmenu+自定义组件写主布局
- Drag & Drop - From List to VideoDisplay
- XHtmlTree - Tree control with support for HTML, XML, Smart Checkboxes, and Drag & Drop
- 重构项目之二:使用瀑布流效果加载图片
- 【Spring Boot&&Spring Cloud系列】使用Intellij构建Spring Boot和Mybatis项目
- Draggabilly – 轻松实现拖放功能(Drag & Drop)