当前位置: 首页 > 工具软件 > JHotDraw > 使用案例 >

JHotDraw之旅: 3.3 面向文档基本框架

郑衡
2023-12-01


 

通过前文, 我们大概了解了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还定义了应用程序的一些基本动作(控制器)的默认实现类,如"关于","退出","复制","剪切"等.

 

未完待续....

 

 

 类似资料: