UIFactory II 技术框架介绍 I UI 层设计 目录
1. 功能节点加载机制 ................................................................................................................... 2 1.1 NC 界面模拟 ................................................................................................................. 2 1.1.1 窗口 ................................................................................................................... 2 1.1.2 顶层面板(工作台)
....................................................................................... 3 1.1.3 工作台—NC logo 与快捷搜索面板 .................................................................. 3 1.1.4 工作台-所有打开的功能节点页签面板 .......................................................... 4 1.1.5 功能节点面板 ................................................................................................... 5 1.1.6 功能窗口部件 ................................................................................................... 7 1.1.7 FuncletWidget(重要理解部分)
................................................................. 7 1.2 加载机制 ....................................................................................................................... 9 1.2.1 示例 ................................................................................................................... 9 1.2.2 需要做的工作 ................................................................................................... 9 1.2.3 查看代码入口 ................................................................................................. 10 1.2.4 菜单项响应件 ................................................................................................. 10 1.2.5 创建界面元素组件容器 FuncletWidgetContainer ........................................ 10 1.2.6 构造 ifunlet 面板的元素和菜单栏的按钮 .................................................... 12 1.2.7 构造状态栏 ............................................................................................................ 20 1.3 按钮定义、配置 ......................................................................................................... 20 1.3.1 增加自定义按钮 ............................................................................................. 20 1.3.2 按钮可用性的影响因素 ................................................................................. 24 1.3.3 常用按钮介绍 ................................................................................................. 26 1.3.4 按钮布局方式:
............................................................................................. 26 1.4 UI 事件框架 ................................................................................................................ 29 1.4.1 常用事件 ......................................................................................................... 29 1.4.2 Xml 配置方式 .................................................................................................. 30 1.4.3 练习:增加一个自己的事件 ................................................................................ 31 2. 树型单据设计 ......................................................................................................................... 31 2.1.1 建立树面板,修改布局组装表 ..................................................................... 32 2.1.2 为树面板,增加应用模型(model)
........................................................... 32 3. UI 设计归纳总结 .................................................................................................................... 34 3.1 背景 ............................................................................................................................. 34 3.2 设计思路 ..................................................................................................................... 35 3.2.1 分离的展显逻辑 ............................................................................................. 35 3.2.2 自助能动的 Action 元素 ................................................................................ 35
3.2.3 Composite 模式来实现组装 .......................................................................... 35 3.3 常用元素介绍 ............................................................................................................. 35 3.3.1 模型层元素 ..................................................................................................... 35 3.3.2 视图层元素 ..................................................................................................... 37 3.3.3 常用的接口介绍 ............................................................................................. 37 3.3.4 NC 的 action 事件 ........................................................................................... 38
1. 功能节点 加载机制 1.1 NC 界面模拟
以下的演示示例 类的命名,我均采用 NC 产品已经有的命名方式。
通过该部分的学习 重点理解 NC 界面之间的层级管理。
开发过程中理解 每级模板自主能动的概念(父模板负责组装,具体功能由各自来实现)
重点理解 FuncletWidget 界面元素组成,前面的部分了解就可以
1.1.1 窗口 1.1.1.1 实现样式 1.1.1.2 代码规划 nc.desktop.ui.NcWindow extends JFrame
1.1.1.3 代码示例
1.1.1.1 显示效果
1.1.2 顶层面板(工作台)
1.1.2.1 实现样式
1.1.1.1 代码规划:
容器面板(nc.desktop.ui.Workbench),使用 borderlayout 布局 North 面板(nc.desktop.ui.WorkbenchTopPanel extends JPanel)
Center 面板(nc.desktop.ui.WorkbenchSpace extends JPanel)
考虑单例 1.1.1.2 代码示例 将其增加到父面板中
增加其子面板
1.1.1.3 显示效果 因为子面板中,还是空的,所以看到效果如下。但是我们代码中知道,已经
增加了两级面板
1.1.3 工作台 —o NC logo 与快捷搜索面板 1.1.3.1 实现样式
1.1.3.2 代码示例 其没有子面板,需要实现如下功能 需要增加底图以及 NC logo 图标代码如下:
备注:通过代码可以知道,NC 界面样式主题位于 NCHOME/resource/themeroot/ 路径下,
使用绿色主题,实现样式如下 1.1.3.3 显示效果
1.1.4 工作台- - 所有打开的功能节点页签面板 1.1.4.1 实现样式
1.1.4.2 代码规划
父面板(nc.desktop.ui.WorkbenchSpace)
容器面板(nc.ui.pub.beans.ExtTabbedPane extends javax.swing.JTabbedPane), 1.1.4.3 代码示例 增加面板到其父面板中
1.1.5 功能节点 面板 1.1.5.1 实现样式
1.1.5.2 代码规划
每个 tab 页签面板 为一个功能节点(nc.funcnode.ui.FuncNodePanel)
制定接口(nc.funcnode.ui.IFuncletWindow),每个功能节点都需要实现该接口
中的方法:
显示功能节点窗口(public void showWindow())和关闭功能节点窗口(public boolean closeWindow())
1.1.5.3 代码示例
登陆成功,默认增加功能导航和消息中心两个功能功能节点 tab
1.1.5.4 显示效果
1.1.6 功能窗口 部件 每个功能节点,界面展示的元素都不相同,NC 采用如下结构展示 每个 FuncNodePanel,使用一个界面元素组件容器(FuncletWidgetContainer extends JPanel)来显示其拥有的元素 。
每个(FuncletWidgetContainer extends JPanel),其使用卡片布局,默认包含一个 FuncletWidget
1.1.7 FuncletWidget (重要理解 部分 )
每个 FuncletWidget 包含三部分,容纳菜单栏、界面信息、状态栏
代码结构如下 FuncletWidget—North 放按钮面板 FuncletWidget—Center 放信息面板 信息面板—SOUTH 放状态栏目 信息面板—CENTER 放界面信息(funclet)
1.2 l xml 加载机制 1.2.1 示例 以下演示使用的的配置文件由 uap_studio 自动生成的主子表结构配置文件 如下图
1.2.2 需要做的工作 接上面的介绍,
在导航菜单双击或者右键打开菜单节点的时候,我们可以预测其响应要做的事件 创建 FuncletWidgetContainer 需要为其创建一个子面板 FuncletWidget。
为了创建一个 FuncletWidget,需要:
a. 创建子面板-菜单栏(放置按钮条)
b. 创建子面板—界面信息,放置界面元素(按钮条,界面元素)
a) 创建子面板--ifunclet 实现类 b) 创建子面板—任务栏 利用创建的 FuncletWidgetContainer 来构造 FuncNodePanel
将 FuncNodePanel 作为一个父面板 ExtTabbedPane 的一个页签名来展示 1.2.3 查看 代码 入口
在你对 NC 产品还不熟悉的时候,可以采用如下的方式 1. 删除 xml 配置文件中的所有信息, 2. 双击功能节点 3. 这个时候 功能节点应该是打不开的,查看控制台的异常信息。通过异常我们可以看到功能节点打开代码执行顺序
1.2.4 菜单 项响应 件
nc.funcnode.ui.FuncletWindowEngine.openNode(OpenParam openParam) 方法由导航菜单项事件响应机制调用:
主要是启动线程,执行功能节点打开方法 openNodeImple()。
在 openNodeImple()中执行如下的工作
1.2.5 创建 界面元素组件容器 FuncletWidgetContainer 1.2.5.1 步骤 1 1 即下图的第 1 部分
1.2.5.1.1 需要做的工作 创建步骤与简单主子面板的创建步骤一样 1. 首先要得到一个 FuncletWidgetContainer 面板
2. 然后得到一个 FuncletWidget 子面板 3. 建立主子面板的关系:将子面板添加到父面板中 1.2.5.1.2 产品代码实现 1. 根据功能节点注册信息 frvo,调用 FuncletWidgetContainerFactory,创建一个FuncletWidgetContainer
2. 每次创建一个 FuncletWidgetContainer,根据功能节点注册信息 frvo,创建一个FuncletWidget,并将其添加到 FuncletWidgetContainer 中
1.2.5.2 步骤 2 2 即下图的第 2 部分
1.2.5.2.1 需要做的工作 创建步骤与简单主子面板的创建步骤一样 1. 首先要创建一个 FuncletWidget 面板(前面已经创建)
2. 然后创建子面板:
菜单栏和界面信息 3. 建立主子面板的关系:将子面板添加到父面板中 1.2.5.2.2 产品代码实现
1.2.6 构造 t ifunlet 面板 的元素 和菜单栏 的按钮
1.2.6.1 实例化
看代码可以了解,根据功能节点注册处指定的功能类名称,来实例化成一个 Ifunclet 类型的对象
使用 uap_studio 自动生成的功 能 类 名 基 类 使 用 nc.ui.pubapp.uif2app.To 类, 便于二次开发扩展,其为 IFunclet 的实现类的子类 还要给节点注册一个参数, 参数名为:
BeanConfig, 值为配置单据界面的 xml 文件的路径,在打开节点的时候会读取并解析该路径下的 xml 文件配置的布局信息 代码实现
以下初始化的,就是读取 xml 文件信息。加载顺序理解 Composite 模式, ,
通 Spring IOC 实现组件的任意组装,达到如下的模式:产品= = 零件+ + 总装表,零件= = 小零件+ + 装配表
1.2.6.2 初始化 —1 1 加载 l xml 文件
关注点:参数名称必须为 BeanConfig 1.2.6.3 初始化 —2 2 加载登陆环境信息 产品代码:
通过代码可以看到,是加载了 xml 中一个 id=”context”的 bean 对象,并使用这个对象记录:当前功能节点信息、当前登陆信息等。
使用场景:
是否必须配置:是 这个 Bean 无论何种类型的单据都需要配置 L XML 配置 示例:
1.2.6.4 初始化 —3 3 加载 xxx Preprocessor 产品代码:
通过代码可以看到,加载了 xml 中所有以 id 已 ”preprocessor”结尾的 bean
使用场景 :
该属性通常使用对标准产品做二次开发的扩展开发时候使用。
L XML 配置 示例:
详见 配置文件\ \ 扩展开发标准 n bean 配置 .xml 1.2.6.5 初始化 —3 3 加载 remoteCallCombinatorCaller 产品代码:
通过代码可以看到,加载了 xml 中所有以 id= ”remoteCallCombinatorCaller”的 bean bean 中元素都实现了接口 IRemoteCallCombinatorUser 调用其 prepare()方法 业务意义:
使用场景:通常使用在加载过程中远程调用比较多的单据中,如主子表单据。所有的远程调用统一预加载。
常见的远程调用:加载单据模板、加载查询模板、加载自定义项 要求:放置在其中的需要预加载的远程调用都必须实现接口 IRemoteCallCombinatorUser L XML 配置 示例:
1.2.6.6 初始化 —4 4 装配总表 1.2.6.6.1 产品代码:
通过代码可以看到,加载一个 id=“container” 的 bean , 1.2.6.6.2 业务意义:
该 bean 是视图层元素的装配总表,指定了界面布局方式和每块布局展示的界面视图,以及按钮 根据需要指定界面布局方式,每一块的布局都可作为零件随时替换。
1.2.6.6.3 L XML 配置 要求:
1. init-method="initUI",必须指定,且不能更改 2. 给 container bean 添加 tangramLayoutRoot 属性,确定具体布局类型。值必须接口TangramLayoutNode 的一个实现类。
3. 布局类型有四种:水平布局、垂直布局、tab 页签布局、面板
赋值界面通常是前三种布局交换使用,划定界面分割方式,每个最小的每个框内放一个面板布局 4. HSNode 即(Horizontal SplitPane Node)水平布局 必须指定左右的布局方式
5. VSNode 即(Vertical SplitPane Node)垂直平布局 必须指定其上下的布局方式
6. TBNode 即(TabbedPane
Node)垂直平布局 必须指定每个页签的布局方式
可选属性 showMode,可在(TabbedPane,CardLayout)选择一个,默认是 TabbedPane TabbedPane,下级的布局按照页签的方式展示。
CardLayout,下级的布局按照卡片的方式展示 7. CNode 即(Component Node)面板 必须指定其子容器面板,即 component 属性
1.2.6.6.4 X Xl ml 配置示例 详细见 配置文件\列表型配置范文.xml 配置文件\管理型配置范文.xml 配置文件\树管理配置范文.xml 配置文件\树卡型配置范文.xml 7 1.2.7 构造状态栏 1.3 按钮 定义、配置
1.3.1 增加自定义按钮 1.3.1.1 非业务 按钮 的定义方法 不需要向后台传递数据,如单个单据的 EXECL 导入,EXECL 导出等 按钮可以继承 nc.ui.uif2.NCAction。例子:nc.ui.uif2.actions.AddAction 为了能够通过 Spring 实例化,需要显示的指定一下默认方法 1.3.1.1.1 属性 :
interceptor 所属类:NCAction 意义:拦截器。详见下节拦截器定义 实例化:通常由 Spring 中注入 exceptionHandler 所属类:NCAction 意义:按钮异常处理类 以上两个属性不要求配置,可以参见 NCAction 的 actionPerformed(E)
方法来查看 M odel 所属类:这个属性要自己新增,提供 get\set 方法 ( 命名习惯上都用这个,但是不要求必须是这个)
V6 中通常使用 nc.ui.uif2.model.AbstractAppModel 类型 意义:把此 action 设置为单据 model 的观察者。必须的 实例化:由 Spring 注入 其他的根据自己的业务需要,定义自己的属性 BtnName 所属类:NCAction 自定义按钮需要指定按钮名称 C C ode 所属类:NCAction 自定义按钮需要指定按钮编码,注意不要跟产品已经有的编码重复
如果不指定 code,报错如下
1.3.1.1.2 O Oe verwrite 方法 doAction) ()
执行具体的相应动作,通常会调用 model 的行为
isActionEnable) ()
(设置当前 action 是否可用, 平台会在模型发出事件通知,调用 它设置按钮的可用状态)
1.3.1.2 标准业务按钮的定义 如 果 需 要 将 变 化 的 数 据 同 步 到 后 台 , 则 按 钮 需 要 继 承nc.ui.pubapp.uif2app.actions.pflow.ScriptPFlowAction(该类是 NCAction 的一个间接子类)
产品对常用的保存、删除、提交、审批、弃审等增加了标准的实现类。
1.3.1.2.1 属性:
1.3.1.3 菜单 按钮 的定义 通常在xml中配置一个nc.funcnode.ui.action.GroupAction或者nc.funcnode.ui.action.MenuAction的 bean 就可以了。
GroupAction:系统自动复制其第一个子按钮的名称和相应事件、控制状态到菜单按钮。
即 在 xml 中对菜单按钮指定名称是不能生效的 点击该菜单按钮能够指定其 复制的子按钮的业务操作 这个菜单按钮也是能够有可用状态控制
MenuAction:只作为一个显示的菜单按钮,一直可用,没有响应事件
1.3.2 按钮可用性的影响因素 在 NC 产品中通常有以下两个因素影响按钮的可用性 :界面状态、业务状态 1.3.2.1 界面状态 即当前 UI 界面所处的状态
V6 设置如下几种状态
Init:初始态,功能节点新打开状态. Add 新增态, EDIT 编辑态 NOT_EDIT 非编辑 通常按钮的操作,需要通过 modle 1.3.2.2 业务状态 在单据上我们通常叫单据状态。有些流程相关的按钮不同的单据状态,按钮的可用性应该是不同的 。如提交按钮,只针对自由态的单据。审批和收回按钮只针对提交态的单据,弃审按钮只针对审批通过的单据。如下图提交态按钮示例
V63 预先指定了一些状态,如果你要使用产品标准的按钮,则单据状态的设置,必须按照其规划来设置。
即自由态的单据,单据状态值必须是-1
1.3.3 常用按钮介绍 V63 已经实现的标准按钮存放在如下的结构中
Actions:标准操作按钮 Actions.Batch:批处理按钮(通常用在单表中,需要批量处理的地方)
Actions.billlist:列表界面操作按钮 Actions. Interceptor:已经实现的常用按钮拦截器 Actions. Pagination:分页处理相关 Actions. Pflow:需要平台流处理(通常是审批流相关:保存、提交、审批、弃审等)的按钮
1.3.4 按钮 布局 方式 1.3.4.1 节点级次布局 页面位置:页签顶部
可见方式:一直可见
展现形式:菜单 应用场景:
1. 如果 tangramLayoutRoot 对应的布局管理,只有一个页签(VSNode、HSNode、CNode 布局)则可考虑这种方式 2. 如果 tangramLayoutRoot 对应的布局管理,即便有多个页签(TBNode),但是显示的按钮不需要根据页签的改变发生变化,也可以考虑这种方式 实现方式:配置在 TangramContainer 中。可以配置浏览态按钮和编辑态按钮
元素 actions:配置浏览状态下任何页签都可见按钮 元素 editActons:配置编辑状态下任何页签都可见的按钮。如果没有编辑态,可不配置 1.3.4.2 页签级布局 显示位置:页面顶部
可见方式:随页签的激活状态决定其可见性
展现形式:菜单
应用场景:
如果顶层容器 tangramLayoutRoot 采用 TBNode 布局,且需要根据页签的改变显示不同的按钮,则采
用这种方式 实现方式:分为绝对布局和相对布局 1.3.4.2.1 绝对布局 1) 将按钮和视图层元素 利用 StandAloneTo 来包装
注意<constructor-arg ref="xxx" />参数要传入对应的视图层元素,(如 listView\billFormEditor) 且视图元素控件必须实现 ITabbedPaneAwareComponent接 口,当页签切换时通知外层容器实现Action的切换。
即<constructor-arg ref="xxx" />指定的视图层显示的时候,才显示其中配置的按钮
2) 利用 to 对包装成的对象进行组织。
id=” to” 的 bean,不需要再做配置,程序会自动加载 1.3.4.2.2 相对布局
这种布局方式不常见,作为了解 1) 将按钮和视图层元素 利用 PlugableTangramContainer 来包装 参数 constraints 传入对应的视图层元素 参数“actions” 传送对应的按钮
2) 利用 to 对包装成的对象进行组织。
3) Container 也要修改成相对布局 后面的布局要指定参照 targetComponent,并制定相对位置
1.3.4.3 视图级 布局 显示位置:视图所在 tab 的右上侧
可见方式:一直可见 展现形式:工具栏 应用场景:如果上层布局采用了 TBNode,则根据需要考虑增加视图按钮 实现方式:
1. 视图元素控件必须实现 IComponentWithActions 接 口。
2. 视图层所在的上级布局必须采用了 TBNode,因为视图级的元素是显示在页签的右上侧,只有 TBNode 才有这个位置 3. 当前卡片视图 nc.ui.pubapp.uif2app.view.ShowUpableBillForm 已经实现了该接口
1.4 I UI 事件框架 1.4.1 常用事件 NC 产品针对自己的界面常用的事件做了封装,常见的有 卡片列表各种编辑事件、组织改变事件、 新增事件、 排序事件、 页签切换事件、行改变事件、合计事件等。
已经实现的事件放在
主要是:
Event:公共的事件或者接口 Event.card:卡片界面常用事件 Event.list:列表界面常用事件
1.4.2 X Xl ml 配置方式 2. 首先配置 nc.ui.pubapp.uif2app.event.EventHandlerGroup 属性 evnent:
取值为具体的 event 类; 属性 picky:
取值可实现 IPickyEventHandler 接口来过滤是否派发事件。如果不需要,则赋值 例如 ChildrenPicky 类则表示按默认的指定 VO 类方式来过滤,即只有 bodyVoClasses 中配置的
VO 类才会派发到对应的事件处理中;
属性 handler:
取值必须实现 IAppEventHandler 接口,接口参数对应具体的 event 类。如下图
3. 利用 AppEventHandlerMediator 来组织事件和模型 model. 注意将其 bean id 以 Mediator 结尾,这样系统才能自动加载
3 1.4.3 练习:增加一个自己的事件
2. 树 型单据 设计 首先要先生成标准的管理型单据,然后将其改造成数管理型单据
2.1.1 建立树面板,修改布局组装表 2.1.1.1 增加树面板
树面板可以使用 nc.ui.uif2.components.TreePanel 或者其子类
2.1.1.2 更改界面总装表( container )指定其布局位置 。
我们需要替换原来的快捷查询区域,将原来的替换掉
2.1.2 为树面板,增加 应用模型 ( model )
1. 模 型 实 例 化 :
树 面 板 配 合 使 用 的 model 是 通 常 使 用nc.ui.uif2.model.HierachicalDataAppModel 或者其子类 2. 模型属性初始化:模型服务类(service)、树构造器策略(treeCreateStrategy)、登陆环境(context)
3. 模 型 服 务 类 ( service ), 模 型 用 来 向 后 台 同 步 数 据 。
可 以 实 现nc.ui.uif2.model.IAppModelService 或者扩展自己的方法
4. 树构造器策略(treeCreateStrategy):用来将查询出来数据组织成树结构。
可使用 nc.vo.bd.meta.BDObjectTreeCreateStrategy。构造器策略需要指定根节点名称和 VO转换工厂 5. 定 义 VO 转 换 工 厂 :
通 常 属 性 结 构 是 查 询 一 个 单 VO 。
可 以 使 用nc.vo.bd.meta.BDObjectAdpaterFactory 来转换 6. 模型管理器:通常用来调用模型的 service 服务,为模型初始化提供数据 每个树的数据初始方式不同,产品没条提供标准模型管理器。
需要实现 nc.ui.uif2.model.IAppModelDataManager 接口,实现其 initModel()方法 通常树节点的左侧的树数据,在 model 加载完成就要查询出来。可以在此完成
7. 创建一个名字如:xxxMediator 类。作为左侧树的模型和右侧的管理模型的协调者 Mediator 类在功能节点打开的时候就能自动加载。
在这个类中为两个模型注册事件监听,抓取到两个模型的变化事件 例:我们可以抓取到右侧模型 模型初始化事件,同时完成我们的左侧树模型初始化。也可以抓取左侧树模型的选择节点变化事件,来同步右侧模型的数据的变化 3. I UI 设计归纳总结( ( 复制自陈伟文档) ) 3.1 背景 NC5.X 系列,采用 UIFactory
I NC6.X 系列,采用 UIFactory II Templet Method 模式, Composite 模式,
UI、EventHandler、Controler 分工,典型的节点能够快速适配,快速开发 通 Spring IOC 实现组件的任意组装,达到如下的模式:产品=零件+总装表,零件=小零件+装配表 非典型的界面不能很好的适配 存储大量代码复制 很好的解决界面多样性的问题 并且实现松耦合的代码结构+高重用的组件
3.2 设计思路 3.2.1 分离的展显逻辑 a. 将一个我们在屏幕上看到的 GUI 元素也按照 MVC 的思想来处理,分成 展现对象(VIEW)和模型对象(MODEL)
b. 展现对象,即是封装后的容器类,用来直观的展现数据 c. 模型对象,用来控制展现对象。一个领域对象通常通常持有持久化信息(VO、services)来培训,将展现层数据和后台持久化服务连通 d. V 依赖 M,M 不依赖 V,一个 M 可以服务多个 V e. V 之间 互不依赖,V 只和 M 打交道,对 V 的操作会触发 M 的行为,V 对 M 的实现进行响应 f. M 之间如果要进行通信,通常设计 xxx Mediator(协调者),用来协调 M 之间信息传递 3.2.2 自助能动的 n Action 元素 Action 应该是细力度的,即功能单一,便于扩展 Action 能自身决定可用性,符合面向对象的特征,通过 ActionContributors 进行组织,以方便 Spring IOC 对应用元素的拼装 3.2.3 e Composite 模式来实现组装 统一的 UI 入口类 To,自动装配; Spring 依赖注入,XML 界面配置组装视图层、模型层、和按钮;
TangramLayout 灵活布局; 3.3 常用元素介绍 3.3.1 模型层元素 appModel 均是 nc.ui.uif2.model.IAppModel 的直接或间接实现类,不同的业务场景有不同的实现,本次只介绍常用的模型
模型名称 应用场景 特点 HierachicalDataAppModel 存储有层次关系的数据模型 利用内部维护的 DefaultTreeModel 来存储树型数据 可以获得当前选中的节点和选中的数据 可以发出 MODEL_INITIALIZED、SELECTION_CHANGED 以及 UISTATE_CHANGED事件
BillManageModel 存储平面数据的模型
应用最多的一个模型 支持单行和多行选择 可以发出 MODEL_INITIALIZED、 SELECTION_CHANGED、UISTATE_CHANGED、DATA_INSERTED、DATA_DELETED、SELECTED_DATE_CHANGED 等事件
BatchBillTableModel 支持进行批量增、删、改等操作的平面型数据模型 只有编辑和非编辑两种状态 需要配套的服务类 IBatchAppModelService 与视图层元素 BatchBillTable 配合使用 可以发出 MODEL_INITIALIZED、 SELECTION_CHANGED、 UISTATE_CHANGED、DATA_UPDATED、DATA_DELETED、DATA_INSERTED 等事件
3.3.2 视图层元素
常见的 NC 视图均直接或间接集成自 javax.swing.JPanel(JPanel 参见 JDK_API)
常见的如下 平面视图 V6 产品通常使用 nc.ui.pubapp.uif2app.view 下的类; 特殊视图(树、参照等)通常使用 nc.ui.uif2.components 下的类 模型名称 应用场景 特点 TreePanel
树型控件的展现面板 与 HierachicalDataAppModel 模型配合使用,响应此模型的事件 BillForm 表单界面的展现控件 利用单据模板的卡片视图(BillCardPanel)进行展现, 支持单表头的卡片也支持标准的卡片视图(聚合 VO 的上卡片下列表形式)
暂时只与 BillManageModel 配合,实现对模型数据的展现以及事件的相应 在 V6 中常使用其子类 ShowUpableBillForm BillCardPanelForm 表单界面的展现控件 与上者的不同是,它只支持单表头的卡片单据,即只有上部的表单,没有下部列表 在 V6 中常使用其子类 ShowUpableBillCardPanelForm BillListView 数据的列表展现 利用单据模板的列表视图(BillListPanel)进行展现,即支持单表头也支持 标准的单据 暂时只与 BillManageModel 配合,实现对模型数据的展现以及事件的相应 在 V6 中常使用其子类 ShowUpableBillListView BatchBillTable 支持批量操作的列表编辑器, 支持数据的展现和编辑 利用单据模板的卡片视图(BillCardPanel)进行展现,利用单据模板的单表体形式实现,因此需要使用单表体的单据模板 与 BatchBillTableModel 配合,实现对 模型数据的展现及事件的响应 在 V6 中常使用其子类 ShowUpableBatchBillTable 与 BatchEditAction、BatchAddLineAction、BatchDelLineAction 等动作配合使用 3.3.3 常用的接口介绍 主要讲解下 模型层、视图层实现的接口 接口名称 作用 实现 IAutoShowUpComponent 将实现该接口的控件转换到可视状态 控件实现该接口,通常利用 AutoShowUpEventSource 作为委托代理
类,将所有接口行为委托给该类实例来实现。
ITabbedPaneAwareComponent 控制实现该接口控件是否可以隐藏;通知外层容器该控件的可见性的切换。
控件实现该接口,通常利用 TabbedPaneAwareCompnonetDelegate
作为委托代理类,将该接口行为委托给该代理类实例完成。
IComponentWithActions 使实现该接口的控件具有提供和展现 Action 的能力,一般用于提供视图级别的 Action,容器会将该控件以 Tab 签的形式展现,并将其 Action 展 现在 Tab 签的右侧。
需要达到该效果的控件实现该接口即可, 通过配置文件注射需要展现的 Action
3.3.4 NC 的 的 n action 事件 Nc 继承 javax.swing.AbstractAction 增加了自己的抽象类nc.funcnode.ui.action.AbstractNCAction, 所有的 action 均集成自该类。NC 中常见的 aciton 如下图所示,根据业务不同,均是对javax.swing.Action 不同实现形式 建议查看 JDK_API 或者相关视频先了解 Action 事件 的特性,再来看 NC 具体的实现
NC 封装的后的 action 如果有业务操作,通常会持有一个 model 元素 将该 action 事件注册到按钮上后,该 action 响应按钮事件就可以操作 model 元素,并将响应间接传递到视图层展现出来
相关热词搜索: 学习 理解 手册