对八进制GEF教程的几点补充

现在中文的GEF教程写的比较好的算是“八进制”的(http://bjzhanghao.cnblogs.com/),它系统的阐述了GEF的架构。我在这里补充几个其教程中没有提到的问题:

1 More about the author.getPaletteRoot是怎么启作用的:

practiceEditor中并没有setPaletteRoot,那么真正的设置那一步是什么时候呢?请看practiceEditor构造函数中的setEditDomain,这个函数除了指定Viewer的editDomain外,还会设置此editDomain的paletteRoot,此过程会顺带设置此editDomain对应的vierw的paletteRoot,也就是说,我们在不清楚初始化函数的调用顺序的时候,Editor构造函数中的那一句setEditDomain(new DefaultEditDomain(this))还是不要乱改位子。

2.viewer的两种setContents函数

GEF的control层为EditPart,View层相当于Viewer,viewer通过setContents来设置其对应的EditPart。但是在实际运用中往往不是把control层的EditPart型作为参数传给setContents,而是直接使用model层的模型以object类型传过去。这也是为什么我们会在Editor的配置函数中指定EditPartFactory的原因。当我们直接使用model层的object来setContents时,GEF会根据EditPartFactory中所指定的control-model对应关系来新建control层,并且把v-c层,c-m层关系都绑定好。这实际上简化了我们的操作。

3.NodePart是什么时候生成的?一个Node框是怎么拖进画布的?

虽然有EditPartFacktory存在,但是代码中并没有一个地方显式的通过setContents(new Node())的方式间接的调用PartFactory.createEditPart()去生成一个Node的EditPart。当我们拖动一个Node进画布时,首先是执行CreateNodeCommand.excute(),这个函数会执行diagram.addNode(this.node),也就是添加Node的model到总表中,顺带执行fireStructureChange,通知总表有更新。fireStructureChange的本质就是firePropertyChange。而Diagram对应的EditPart已经注册了PropertyChangeListener,它的响应是refreshChildren。此时我们重写的getModelChildren函数的作用就体现出来了,它会指定diagram与下一级model的关系。refreshChildren也就会顺着这一层关系找到其下一级的model有哪些还没有对应的EditPart生成。

发表评论

电子邮件地址不会被公开。 必填项已用*标注