则图片上表格中的值与模型对象之间的关系,这样就不难理解Translator数据转换器需要做的事情了,接下来看下它的类图;
其中AbstractKTableFactory# doCreateControl方法,在创建UI控件的时候调用了getTranslator方法返回的就是实现IObjectTranslator接口的子类;protected Control doCreateControl(Composite r_Parent, UIDefinition r_UIDefinition) {……………………………………………………………………… IObjectTranslator t_Translator = this.getTranslator(); IKTableColumn[] t_Columns = this.getColumns(); for (int i = 0; i < t_Columns.length; i++) { if (t_Columns[i] instanceof AbstractTableColumn) { AbstractTableColumn t_Column = (AbstractTableColumn) t_Columns[i]; t_Column.setIntrospector(t_Translator.getIntrospector());//这里会为每一个column设置一个数据访问器 } }……………………………………………………………………… return createActionComposite(r_Parent, r_UIDefinition.isView()); }看下IObjectTranslator接口中定义的方法;
同样formeTree和toTree方法,适用于KTreeBuilder创建出来的UI控件上表格数据的保存和回显;
fromTable方法在AbstractKTableFactory中的save方法中被调用,一般用于UI界面上编写好数据,类似按保存按钮,或者向导中“确定”或者“完成”按钮时候调用,用于把表格中填写的数据存在一个数据备忘录IMemento中。
toTable方法在这个UI界面被构造的时候方法中,new一个数据备忘录IMemento(后面的章节会讲到)的时候被调用,用于回显上一次填写的数据。备忘录IMemento提供一个数据备份和恢复的接口,可以用来备份数据和恢复数据.它与IStore非常相似,但是为了便于理解,使用Memento名字。可以参考Memento模式,下图为实现IMemento接口的子类,都可以根据自己控件的特性来备份恢复数据;
接口中就定义了2个方法,分别为backup备份数据,restore恢复数据,我们先可以来看一下TableMemento中的方法;protected List doBackup(String r_Type, Object r_Model) { if (null==this.objectTranslator) { return new ArrayList(); } else{ return this.objectTranslator.toTable(r_Type, r_Model); } }
在Translator章节中我们讲述了toTable方法,它是翻译成一个可以用于表格数据的列表,在AbstractKtableFactory中构造UI的方法中(doCreateControl)方法中我们会新建一个TableMemento的实例对象。在构造TableMemento实例的时候就会调用构造函数中的backup方法来保存UI界面中控件的值。
那接口中restore恢复数据何时被调用呢?可以看下图,例如我们在数据集编辑器中空白处点击右键出现的菜单如下图;
ICommand是用来提供Redo和Undo的接口,SimpleCommand则是ICommand的实现类,实现类中的redo和undo方法都会调用IMemento实现类的restore方法调用后来恢复数据。
基本概念说完了,我们看下具体的表格工厂:KTable、KTree、Table。
KTable表格工厂
AbstractKtableFactory用来支持表格控件的创建。
getCloumns方法:返回一个IKTableColumn []的数组,必须由子类来实现,IKTableColumn是用来支持Ktable的表格列,一般只需要构造一个KPropertyTableColumn(该数据列用来通过property来访问对象)就可以了。getActionProvider方法:返回的IKTableActionProvider是控件上的一些Action操作,通常可以通过创建DefaultKTableActionProvider对象来实现。子类可以重写这个方法来构造自己的Action来进行对表中的数据进行操作。getTranslator方法:返回数据数据转换器,通常为自己自定义的数据转换类