通过前文, 我们大概了解了JHotDraw的MVC架构.简单的, 试想如果要实现一个日记程序(Daily), 应该有如下步骤:
1. 定义模型(model): DialyModel. 该模型封装了程序的名称(daily), 版本(1.0), 版权(你);
2. 定义视图(view):DailyView. 该视图可以是一个JPanel, 里面包括一个填写日记内容的JTextPane, 两个用于保存和打开的按钮(仅仅是按钮, 并没有按钮按下的动作);
3. 定义控制类(controller): 定义用于保存和打开日记的控制方法.
4. 将视图添加到模型: 通过model.setView/ViewClass方法将DailyView添加到DialyModel.
5. 将模型添加到应用程序:创建一个DailyApplication, 并通过setModel方法添加模型;
6. 启动程序: 调用DialyApplication.launch 方法.
下面补充JHotDraw框架(framework)主要接口的框架契约(contract of a framework).
设计模式:Framework(框架)
以下的接口和org.jhotdraw.app.action 包里所有类定义了面向文档应用程序的契约: ApplicationModel(org.jhotdraw.app), View(org.jhotdraw.app).
1. 接口 Application (org.jhotdraw.app) 应用程序
JavaDoc:
Application 用于控制View类的生命周期并提供一个窗口来显示View类.
一个application拥有一个ApplicationModel, ApplicationModel封装了关于application的信息(名称,版本,版权)以及创建View的模板方法.
application实现了基于文档界面的风格(document interface style), 一个application可以同时处理一个或者多个文档.
典型的文档界面有单文档界面(SDI, Single Document Interface), 多文档界面(MDI, Multiple Document Interface)和Mac系统界面(OSX, Mac OS X Application Interface). 针对这些文档风格, JHotDraw已经提供了每种文档的默认实现.
一些应用程序需要对所有打开的窗口和对话窗进行特别的设置, 这就需要在打开JFrame, JDialog或JWindow时调用application的addWindow/Palette 或removeWindow/Palette方法.(仅7.4之后的版本)
该类的使用方法:
public class MyMainClass {
public static void main(String[] args) {
Application app = new SDIApplication(); // or OSXApplication(), MDIApplication().
DefaultApplicationModel model = new DefaultApplicationModel();
model.setName("MyApplication");
model.setVersion("1.0");
model.setCopyright("Copyright 2006 (c) Werner Randelshofer. All Rights Reserved.");
model.setViewClassName("org.jhotdraw.myapplication.MyView");
app.setModel(model);
app.launch(args);
}
2. 接口 ApplicationModel (org.jhotdraw.app) 应用程序模型
ApplicationModel提供Application的元数据(名称,版本,版权), Application的控制器, 创建视图,工具栏及URIChooser的工厂方法.
3. 接口 View(org.jhotdraw.app) 视图
View通过JComponent来显示应用程序的文档.
文档以URI格式定位(一个文档的URI应为 file://home/readme.txt). 如果在多视图界面中打开同一个文档, 则应用程序将为每个文档设置"多重打开标志"来区分这些视图.
view(视图)的生命周期由application控制, 一个view的生命周期为:
1.创建(Creation): 应用程序通过调用view类的newInstance()方法将view实例化;
2.初始化(Initialisation): 应用程序调用view类的以下方法: setActioinMap(), setApplicatiin(), init().然后通过工作者线程(worker thread)调用clear()或者read()方法;
3. 开始(Start):应用程序将view添加到一个容器(如JFrame)中, 并调用view类的start方法.
4. 激活(Activation): 当view在应用程序中被激活时, 应用程序调用其activate()方法.
5. 钝化(Deactivation):当view不处在被激活状态(如其它view被激活), 在应用程序调用其deactivate(0方法. 钝化的view可以再次被激活;
6. 停止(Stop):应用程序调用view的stop()方法来停止view, 并将其从应用程序容器中删除. 停止后的view可以通过开始(Start)再次显示.
7. 销毁(Dispose):当一个view不再需要时, 应用程序调用其dispose()方法来销毁一个view. dispose()方法通过setApplication(null)并删除所有对它的引用而进入垃圾回收机制.
4. 包 org.jhotdraw.app.actions 控制器
提供"面向文档的应用程序"的抽象动作(abstract actions)及其默认实现的动作. 按照框架契约, 应用程序层次的所有动作都必须继承自org.jhotdraw.app.actions.AbstractApplicationAction类. 该类定义了诸如此类的属性:当应用程序处在disable状态时, 所有继承自AbstractApplicationAction的动作(控制器)的状态也都为disable. 基于swing的特性, 所有继承自AbstractApplicationAction的动作(控制器)既可以作为一个菜单项(menu item),也可以作为工具栏按钮. 当然, 这些动作也可以仅添加在指定的视图上.
org.jhotdraw.app.actions还定义了应用程序的一些基本动作(控制器)的默认实现类,如"关于","退出","复制","剪切"等.
未完待续....