快捷搜索:  as  test  1111  test aNd 8=8  test++aNd+8=8  as++aNd+8=8  as aNd 8=8

新葡的京集团350vip_酒文化网进入



先简单回首一下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 新葡的京集团350vipcolor) {

if (this.color.equals(color)) {

return;

}

this.color = color;

firePropertyChange(PROP_COLOR, null, color);

}二、然后,要让Node的color属性变更能够反应到图形上,是以要改动NodePart里的propertyChanged()和 refreshVisuals()措施,在前者里增添对color属性的相应,在后者里将NodeFigure的背景颜色设置为Node的color属性对应的颜色。(留意,Color工具是系统资本工具,实际应用里必要缓存以避免新葡的京集团350vip系统资本耗尽,为节约篇幅起见,示例代码直接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.get新葡的京集团350vipColor()));//TODO cache color instances

}

四、现在有一个问题,这个Request的实例应该在哪里天生?谜底是在Tool里,用户在画布区域按下鼠标左键时,当前 Palette里当选中的Tool认真创建一个Request。我们现在面对的这个需求必要我们创建一种新的Tool:ChangeColorTool。我们让ChangeColorTool承袭org.eclipse.gef.tools.SelectionTool,由于“上色对象”的用法和“选择对象”基础上差不多。显然,我们必要覆盖的是handleButtonDown()措施,用来奉告gef假如用户当前选择了这个对象,在画布区域按下鼠标会发生什么工作。代码如下:

import org.eclipse.gef.EditPart;

import org.eclipse.gef.commands.Command;

import org.eclipse.gef.tools.SelectionTool;

import org.eclipse.swt.graphics.RGB;

import com.example.model.Node;

import com.example.parts.NodePart;

public class ChangeCol新葡的京集团350viporTool extends SelectionTool {

private RGB color;

public ChangeColorTool(RGB color) {

super();

this.color = color;

}

/**

* If target editpart is an {@link NodePart}, create a {@link ChangeColorRequest} instance,

* get command from target editpart with this request and execute.

*/

@Override

protected boolean handleButtonDown(int button) {

//Get selected editpart

EditPart editPart = this.getTargetEditPart();

if (editPart instanceof NodePart) {

NodePart nodePart = (NodePart) editPart;

Node node = (Node) nodePart.getModel();

//Create an instance of ChangeColorRequest

ChangeColorRequest request = new ChangeColorRequest(node, color);

//Get command from the editpart

Command command = editPart.getCommand(request);

//Execute the command

this.getDomain().getCommandStack().execute(command);

return true;

}

return false;

}

}

到今朝为止,ChangeColorRequest已经可以发出了,接下来要办理的问题是若何让EditPart处置惩罚这个哀求。

七、我们知道,gef里任何对模型的改动都是经由过程command完成的,是以一个ChangeColorCommand肯定是必要的。它的execute()措施和undo()措施如下所示:

public class ChangeColorCommand extends Command{

private RGB oldColor;

@Override

public void execute() {

oldColor = node.getColor();

node.setColor(color);

}

@Override

public void undo() {

node.setColor(oldColor);

}

}八、EditPolicy认真接管所有的Request,以是还要创建一个ChangeColorEditPolicy。鄙人面列出的代码里,你会看到我们定义了一个新的“Role”字符串,过一下子我们在EditPart上安装这个EditPolicy的时刻要以这个字符串作为Key,以避免覆盖EditPart上已有的其他EditPolicy。

import org.eclipse.gef.Request;

import org.eclipse.gef.commands.Command;

import org.eclipse.gef.editpolicies.AbstractEditPolicy;

import org.eclipse.swt.graphics.RGB;

import com.example.model.Node;

public class ChangeColorEditPolicy extends AbstractEditPolicy {

final static public String CHANGE_COLOR_ROLE = "CHANGE_COLOR_ROLE";

@Override

public Command getCommand(Request request) {

//Judge whether this request is intersting by its type

if (request.getType() == ChangeColorRequest.REQ_CHANGE_COLOR) {

ChangeColorRequest theRequest = (ChangeColorRequest) request;

//Get information from request

Node node = theRequest.getNode();

RGB color = theRequest.getColor();

//Create corresponding command and return it

ChangeColorCommand command = new ChangeColorCommand(node, color);

return command;

}

return null;

}

}

九、着末照样回到EditPart,前面在第二个步骤里我们曾经改动过的NodePart里还有着末一处必要添加,那便是在installEditPolicies()措施里添加刚刚创建的ChangeColorEditPolicy:

protected void createEditPolicies() {

//Add change color editpolicy

installEditPolicy(ChangeColorEditPolicy.CHANGE_COLOR_ROLE, new ChangeColorEditPolicy());

}

现在我们已经完成了所有需要的改动,来看一下运行结果。

总结一下,必要创建的类有:ChangeColorRequest, Ch新葡的京集团350vipangeColorTool, ChangeColorToolEntry, ChangeColorCommand, ChangeColorEditPolicy;必要改动的类有:Node, NodePart, PaletteFactory。在实例项目里,为了方便大年夜家浏览,所有新创建的类都放在com.example.request包里,实际项目里照样建议分手放在对应的包里。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

您可能还会对下面的文章感兴趣: