首页 / 软件开发 / JAVA / [Eclipse]GEF入门系列(十二、自定义Request)
[Eclipse]GEF入门系列(十二、自定义Request)2011-04-19 cnblogs bjzhanghao先简单回顾一下Request在GEF里的作用。Request是GEF里一个比较重要的角色,Tool将原 始的鼠标事件转换为EditPart可以识别的请求,Request则承载了这些请求信息。举例来说, 用户在调色板(Palette)里选择了创建节点工具(CreationTool),然后在画布区域按下鼠 标左键,这时产生在画布上的鼠标单击事件将被CreationTool转换为一个CreateRequest,它 里面包含了要创建的对象,坐标位置等信息。 EditPart上如果安装了能够处理 CreateRequest的EditPolicy,则相应的EditPolicy会根据这个 CreateRequest创建一个 Command,由后者实际执行创建新对象的必要操作。GEF已经为我们提供了很多种类的Request,其中最常用的是CreateRequest及其子类 CreateConnectionRequest,其他比较常见的还有SelectionRequest,ChangeBoundsRequest 和 ReconnectRequest等等。要实现一个典型的图形化应用程序,例如UML类图编辑器,这些 预定义的Request基本够用了。然而各种稀奇古怪的需求我相信大家也见过不少,很多需求不 太符合约定俗成的使用习惯,因此实现起来更多依赖开发人员的编码,而不是开发框架带来 的便利。在这种时候,我们唯一的期望就是开发框架提供足够的扩展机制,以便让我们额外 编写的代码能和其他代码和平共处,幸好GEF是具有足够的扩展性的。有点跑题了,再回到 Request的问题上,为了说明什么情况下需要自定义 Request,我在前文“应用实例”里的示 例应用基础上假设一个新的需求:在Palette里增加三个工具,作用分别是把选中节点的背景颜色改变为红色、绿色和蓝色 。假如你用过Photoshop或类似软件,这个需求很像给节点上色的“油漆桶”或“上色工具 ”,当然在用户界面的背后,实际应用里这些颜色可能代表一个节点的重要程度,优先级或 是异常信息等等。现在,让我们通过创建一个自定义的Request来实现这个需求,还是以前文 中的示例项目为基础。一、首先,原来的模型里节点(Node)类里没有反映颜色的成员变量,所以先要在Node类 里添加一个color属性,以及相应的 getter/setter方法,注意这个setter方法里要和其他成 员变量的setter方法一样传递模型改变的消息。仿照其他成员变量,还应该有一个静态字符 串变量,用来区分消息对应哪个属性。final public static String PROP_COLOR = "COLOR";
protected RGB color = new RGB(255, 255, 255);
public RGB getColor() {
return color;
}
public void setColor(RGB color) {
if (this.color.equals(color)) {
return;
}
this.color = color;
firePropertyChange(PROP_COLOR, null, color);
}二、然后,要让Node的color属性变化能够反映到图形上,因此要修改NodePart里的 propertyChanged()和 refreshVisuals()方法,在前者里增加对color属性的响应,在后者里 将NodeFigure的背景颜色设置为Node的color属性对应的颜色。(注意,Color对象是系统资 源对象,实际使用里需要缓存以避免系统资源耗尽,为节约篇幅起见,示例代码直接new Color()了)public void propertyChange(PropertyChangeEvent evt) {
if (evt.getPropertyName().equals(Node.PROP_COLOR))//Response to color change
refreshVisuals();
}
protected void refreshVisuals() {
((NodeFigure) this.getFigure()).setBackgroundColor(new Color(null, node.getColor()));//TODO cache color instances
}