GXT之旅:第七章:MVC——Status toolbar
来源:互联网 发布:艾格淘宝商城旗舰店 编辑:程序博客网 时间:2024/04/28 09:44
一个AppEvent不仅仅可以被一个Controller所捕捉,它可以被多个Controller所捕捉,关键在于有多少个Controller注册了该AppEvent。
下面我们要结合之前代码,新建一个新的StatusController,注册之前已有的Events,使用StatusToolbar component来给用户显示系统的运行状态。
我们现在针对两个以后的事件:
- Feed selected
- Item selected
下面具体实现步骤如下:
- AppEvents类里,加入新的EventType定义——StatusToolbarReady
public static final EventType StatusToolbarReady = new EventType();
- 在com.danielvaughan.rssreader.client.mvc.controllers包下,新建类——StatusController。具体内容如下
package com.danielvaughan.rssreader.client.mvc.controllers;import com.danielvaughan.rssreader.client.mvc.events.AppEvents;import com.danielvaughan.rssreader.client.mvc.views.StatusView;import com.extjs.gxt.ui.client.mvc.AppEvent;import com.extjs.gxt.ui.client.mvc.Controller;public class StatusController extends Controller { private StatusView statusView; public StatusController() { registerEventTypes(AppEvents.Init); registerEventTypes(AppEvents.Error); registerEventTypes(AppEvents.UIReady); registerEventTypes(AppEvents.FeedSelected); registerEventTypes(AppEvents.ItemSelected); } @Override public void handleEvent(AppEvent event) { forwardToView(statusView, event); } @Override public void initialize() { super.initialize(); statusView = new StatusView(this); }}
- 在com.danielvaughan.rssreader.client.mvc.views包下,新建StatusView。具体实现如下
package com.danielvaughan.rssreader.client.mvc.views;import com.extjs.gxt.ui.client.mvc.AppEvent;import com.extjs.gxt.ui.client.mvc.Controller;import com.extjs.gxt.ui.client.mvc.View;public class StatusView extends View {public StatusView(StatusController statusController) { super(statusController); }@Overrideprotected void handleEvent(AppEvent event) {}}
- 新建好后,再定义两个新的属性——Status和ToolBar。在定义一个新的方法,用来设置Status的显示内容
private final Status status = new Status();private final ToolBar toolBar = new ToolBar();public void setStatus(String message) {status.setText(message);}
- 继续在StatusView类里,新建方法onInit,用来对应Init事件处理。其内容一部分是装配Status和ToolBar;另一部分是派发StatusToolbarReady事件,并携带刚刚装配好的toolBar
private void onInit() {status.setWidth("100%");status.setBox(true);toolBar.add(status);Dispatcher.forwardEvent(new AppEvent(AppEvents.StatusToolbarReady,toolBar));}
- 自然的,要在handleEvent方法里编写Init事件的流程控制。
@Overrideprotected void handleEvent(AppEvent event) {EventType eventType = event.getType();if (eventType.equals(AppEvents.Init)) {onInit();setStatus("Init");}}
- 针对于*Ready的事件,其捕捉的Controller都是AppController,因此要在AppController注册StatusPanelReady
public AppController() {registerEventTypes(AppEvents.Init);registerEventTypes(AppEvents.Error);registerEventTypes(AppEvents.UIReady);registerEventTypes(AppEvents.NavPanelReady);registerEventTypes(AppEvents.FeedPanelReady);registerEventTypes(AppEvents.ItemPanelReady);registerEventTypes(AppEvents.StatusToolbarReady);}
- 随着AppController里有新的事件被注册了,因此就要在响应的View里编写事件的处理方法——编辑AppView类,新建onStatusToolbarReady方法,其内容是把AppEvent所携带的Component,加入到mainPanel里显示出来~~~
private void onStatusToolbarReady(AppEvent event) {Component component = event.getData();mainPanel.setBottomComponent(component);}
- 编辑AppView类handleEvent方法,针对StatusPanelReady事件的流程处理。
@Overrideprotected void handleEvent(AppEvent event) {EventType eventType = event.getType();if (eventType.equals(AppEvents.Init)) {onInit(event);} else if (eventType.equals(AppEvents.Error)) {onError(event);} else if (eventType.equals(AppEvents.UIReady)) {onUIReady(event);} else if (eventType.equals(AppEvents.NavPanelReady)) {onNavPanelReady(event);} else if (eventType.equals(AppEvents.FeedPanelReady)) {onFeedPanelReady(event);} else if (eventType.equals(AppEvents.ItemPanelReady)) {onItemPanelReady(event);}else if (eventType.equals(AppEvents.StatusToolbarReady)) {onStatusToolbarReady(event);}}
- 好像大家都忘了,事件需要被某些Controllers里注册,同样的Controllers也需要在应用里注册!编辑整个应用的入口类——RSSReader,注册StatusController
@Overridepublic 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());//heredispatcher.dispatch(AppEvents.Init);dispatcher.dispatch(AppEvents.UIReady);}
- 回归到StatusView类,开始编写针对FeedSelected事件的处理。(因为StatusController在最后被注册,所以FeedSelected事件会先被派发到FeedController,最后才是StatusController。)
@Overrideprotected void handleEvent(AppEvent event) {EventType eventType = event.getType();if (eventType.equals(AppEvents.Init)) {onInit();setStatus("Init");} else if (eventType.equals(AppEvents.FeedSelected)) {Feed feed = event.getData();setStatus("Feed Selected - (" + feed.getTitle() + ")");}}
- 相似的,在StatusView类,编写针对ItemSelected事件的处理。
@Overrideprotected void handleEvent(AppEvent event) {EventType eventType = event.getType();if (eventType.equals(AppEvents.Init)) {onInit();setStatus("Init");} else if (eventType.equals(AppEvents.FeedSelected)) {Feed feed = event.getData();setStatus("Feed Selected - (" + feed.getTitle() + ")");} else if (eventType.equals(AppEvents.ItemSelected)) {Item item = event.getData();setStatus("Item Selected - (" + item.getTitle() + ")");}}
- 运行效果如下:
- GXT之旅:第七章:MVC——Status toolbar
- GXT之旅:第七章:MVC——标准的MVC与GXT MVC
- GXT之旅:第七章:MVC——GXT MVC的相关类
- GXT之旅:第七章:MVC——MVC重构项目(1)
- GXT之旅:第七章:MVC——MVC重构项目(2)
- GXT之旅:第七章:MVC——MVC重构项目(3)
- GXT之旅:第七章:MVC——MVC重构项目(4)
- GXT之旅:第七章:MVC——Navigation,Main和Item区域交互(1)
- GXT之旅:第七章:MVC——Navigation,Main和Item区域交互(2)
- GXT之旅:第五章:高级Components(5)——ToolBar
- GXT之旅:第五章:高级Components(6)——TabPanel,Status大概介绍
- GXT之旅:第二章:GXT组件(1)——组件层次结构
- GXT之旅:第二章:GXT组件(2)——渲染和容器
- GXT之旅:第二章:GXT组件(3)——事件和监听
- GXT之旅:第二章:GXT组件(4)——容器的布局
- GXT之旅:第二章:GXT组件(5)——加载消息
- GXT之旅:第二章:GXT组件(6)——定制组件
- GXT之旅:第二章:GXT组件(7)——Button和Tooltip
- 示使用relaxscan暴力破解SSH
- WIN7库文件不见了解决方案
- JSP 网络书签按钮聚合网站
- 2012年4月7日微软实习生笔试题目之一
- Java程序设计的十个原则
- GXT之旅:第七章:MVC——Status toolbar
- printk()函数的使用
- Java根据word模板生成word文档之设计架构
- 9.2 Time 类中的<<和>>运算符的重载
- myeclipse java.lang.OutOfMemoryError: PermGen space 错误
- 一个西瓜 4刀最多多少块
- Linux服务器下查看网络流量
- struts.xml
- 整数 shuffle