http://blog.sina.com.cn/swingjava[订阅][手机订阅]
字体大小: 正文
swing_designer项目的总体结构(2007-08-07 19:04:57)
    我经常觉得写个复杂软件容易,描述清其设计结构却往往很困难。这个项目就是这样,有一种无从下手的感觉。目前这个工具在规模上已经超过三分之一了,为了照顾其灵活性、可扩展性、易用性等指标,它已经过了三四次重构,目前已膨胀到十三个包、八十多个源文件。如何描述清其结构和设计理念不是件简单的事。
    这个项目的名字叫swing_designer,其功能还只局限于基本的界面设计包括组件编辑和布局管理。对于组件树的浏览、组件属性编辑、组件事件编辑以及代码解析和生成还做任何涉及。说的简单些,目前其实是实现了一个的大组件,能进行简单界面设计的复杂组件。
    同其它标准Swing组件一样,它是遵循MVC模型设计的。如果你读过前面关于swing体系结构的文章,就会对这一结构比较了解。考虑到这是个并非通用组件,因此虽然设计成了包含UI类的Swing架构,但对于UI类没有进行过多设计。
    项目所包含的类包如下:
    其中dyno.swing.designer.beans、dyno.swing.designer.beans.events和dyno.swing.designer.models是理解这个工具最关键的三个包,它们分别实现了该组件V(视图)、C(行为)和M(模型)逻辑。dyno.swing.designer.beans定义了基本组件SwingDesigner及一些主要扩展接口。dyno.swing.designer.beans. events定义了组件的鼠标和键盘事件处理器,及由SwingDesigner发出的事件和事件处理器接口。dyno.swing.designer.beans.models定义了用来保存临时设计状态的数据,如当前选中的组件,当前鼠标拖拽区域,当前被添加的组件及BeanInfo,当前鼠标位置等等。
    注意界面设计的元数据保存在SwingDesigner中,其根节点是SwingDesigner的成员变量rootComponent。关于如何存储设计界面的数据,我考虑过很多方案。以前用的方法是为设计组件和设计数据各建立一个树。这种方法虽然灵活,但两个树之间的状态同步却是一个非常麻烦的事情。现在这个项目中采用一个树,即设计界面的组件树。其变量名保存于Component的name属性中,其他描述数据保存于自定义client property中。这样避免了数据同步的问题,又可灵活地存储复杂的描述数据。
    为降低鼠标和键盘事件处理的复杂度,界面设计工具在运行时分为两种状态:普通编辑状态以及组件添加状态。在普通编辑状态中,用户可以选择、拖拽正在设计的组件,还可以剪切、删除、复制、粘帖组件,另外还可以进行各种对齐操作。在普通编辑状态下,还可激活上下文菜单,从菜单中选择针对当前选中组件的操作。目前只有实现了一个上下文菜单,就是切换容器的布局管理器。以后会随着其他功能的加入而逐渐加入其他菜单。
    组件添加状态是种独占状态。在此状态中,鼠标能进行的操作只有放置添加组件,任何编辑状态下的操作都不能进行。在组件面板上选择组件能够进入添加状态。如需要返回普通编辑状态,需要放置被添加组件,或显式地从工具栏里选择编辑模式。两种状态进行切换时会触发DesignerState事件。
     另外界面设计工具一般都设计成可扩展的插件式平台。由于界面设计使用的组件可能千差万变,用户还可能自定义组件和布局器,因此界面设计工具一般设计成以组件和布局器为基本扩展元素的平台。
     为实现这种可扩展性,界面设计工具往往扩展java beans工具实现这一目的。缺省java平台提供的java beans元数据描述对象BeanInfo往往有限,不足以描述或者提供界面设计时需要数据,并且对布局管理器就根本没有提供描述方法,因此界面设计工具一般都会对java beans工具进行扩展,实现独立JavaBeans元数据描述机制。管理这种元数据描述对象的模块类似于插件管理平台,设计工具所需的组件元数据信息都从这儿获取。
    swing_designer采用类似方法,为组件和布局管理器分别提供了描述接口:ComponentAdapter和LayoutAdapter。它们相当于插件接口,实质上是对BeanInfo进行的扩展,目的是为界面设计工具提供特殊的行为和信息支持。其管理工具类是AdapterBus,这是个简单的插件管理平台,采用配置文件注册的方式,将各种组件和布局管理器对应的Adapter实现注册进来,供界面设计工具使用。
    综上所述,此界面设计工具的总体结构如下:
 
    其中热键的处理采用代理模式:在键盘处理器代理上注册各种热键及其热键处理器,由代理负责键盘事件的捕捉和分发。绿色部分是界面设计工具的扩展点,新的自定义组件或布局管理器如需要特殊的设计行为,可实现Component Adapter及LayoutAdapter,并在配置文件中进行注册。项目已经在dyno.swing. designer.beans.adapters实现了常见组件及布局管理器的Adapter。
    除上面所提的核心包,其他包dyno.swing.designer.beans.context实现上下文菜单;dyno.swing.designer.beans.keys是实现各种热键处理器;dyno.swing. designer.beans.location是鼠标在拖拽时的位置枚举实现,用来控制拖拽行为;dyno.swing.designer.beans.painters实现组件添加时的位置提示;dyno.swing. designer.beans.toolkit实现组件选择面板;dyno.swing.beans和dyno.swing. beans.resource是把以前的FolderPane拿过来作为组件面板使用;dyno.swing. beans.layouts是自定义的一个AbsoluteLayout,目的是实验工具对于自定义布局管理器的扩展功能。
    我对于这个工具的系统结构设计并不是十分满意,以后会随着项目的前进,可能对这部分做一些重构,但大的结构调整不会再有了。 
加载中,请稍候...
  • 评论加载中,请稍候...

验证码:请点击后输入验证码  收听验证码

发评论

以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

相关博文
读取中...
推荐博文
读取中...