您的位置:首页 > 编程语言 > PHP开发

AbstractEditPart类中的几个重要方法的解析

2011-11-17 22:42 274 查看
1.refreshVisuals方法

默认情况下,方法 refreshVisuals() 仅在 EditPart 初始化的过程中调用一次,并且决不会被再次调用。在响应模型通知时,应该由程序员负责根据需要再次调用 refreshVisuals()以更新图形(当需要利用来自模型的数据更新图形时,你可以在程序中调用该方法)。为改进性能,您可能希望将每个模型属性的代码分解成其自己的方法(或者是一个带有“开关(switch)”的方法)。这样,当模型发出通知时,可以运行最少的代码以便只刷新那些发生更改的内容。

eg:

package tutogef.parts;

import java.beans.PropertyChangeEvent;

import java.util.List;

import org.eclipse.draw2d.IFigure;

import org.eclipse.gef.EditPolicy;

import tutogef.fingures.EnterpriseFigure;

import tutogef.models.Enterprise;

import tutogef.models.Node;

import tutogef.policies.AppEditLayoutPolicy;

public class EnterpriseEditPart extends AbstractAppEditPart {

@Override

protected IFigure createFigure() {

EnterpriseFigure figure = new EnterpriseFigure();

return figure;

}

@Override

protected List getModelChildren() {

return ((Enterprise) getModel()).getChildren();

}

//需要利用来自模型的数据更新图形时,可以覆盖此方法

@Override

protected void refreshVisuals() {

EnterpriseFigure figure = (EnterpriseFigure) getFigure();

Enterprise model = (Enterprise) getModel();

figure.setAddress(model.getAddress());

figure.setName(model.getName());

figure.setCapital(model.getCapital());

}

@Override

protected void createEditPolicies() {

installEditPolicy(EditPolicy.LAYOUT_ROLE, new AppEditLayoutPolicy());

}

@Override

public void propertyChange(PropertyChangeEvent evt) {

if (Node.PROPERTY_LAYOUT.equals(evt.getPropertyName())) {

refreshVisuals();//模型改变,调用refreshVisuals刷新自身

}

if (Node.PROPERTY_DELETE_NODE.equals(evt.getPropertyName())) {

refreshChildren();

}

if (Node.PROPERTY_ADD_NODE.equals(evt.getPropertyName())) {

refreshChildren();

}

}

}

2.getModelChildren() 方法

该方法返回子模型对象的列表(例如图中的节点)。超类将使用这个模型对象列表来创建对应的 EditPart。新创建的 EditPart 被添加到部件的子 EditPart 列表。这样又会将每个子 EditPart 的图形添加到示例图。缺省情况下,将返回一个空的列表,这表明没有子对象。

如果某个模型包含有子模型(孩子),此方法一定要覆盖。

3.getModelSourceConnections() 和 getModelTargetConnections()

这两个方法在AbstractGraphicalEditPart中。

如果你的模型有连接,此连接一定要实现。这两个方法返回表示节点之间连接的模型对象。

其中getModelSourceConnections返回当前结点作为源时的连接模型(即从当前节点连出去的连接模型);

getModelTargetConnections返回当前结点作为目标时连接模型(从从外面节点连进来的连接模型)。

请注意,连接是由每端的节点引用的,而其 EditPart 只需创建一次。GEF 确保只创建一次连接,该工作是通过首先检查查看器中是否已经存在连接来完成的。

如果某个EditPart要作为连接的节点,那么下面两个方法是一定要覆盖的。它的作用和

@Override

protected List getModelChildren() {

return getCastedModel().getChildren();

}

方法类似。这是需要覆盖的方法

@Override

protected List getModelSourceConnections() {

return getCastedModel().getSourceConnections();

}

@Override

protected List getModelTargetConnections() {

return getCastedModel().getTargetConnections();

}

同时,它需要实现NodeEditPart接口

4.refreshChildren()方法

如果添加或删除了一个子模型对象,应该调用refreshChildren(),调用 refreshChildren() 将导致对应的 EditPart 及其图形被添加或除去。

refreshVisuals适用于图形简单的属性更改。

5.activate()和deactivate()

activate将当前EditPart注册为模型的监听器。deactivate,删除监听器。加侦听器但却忘记除去它们是导致内存泄漏的常见原因。出于这个原因,添加和除去侦听器的地方应该在 API 中清晰地注明。您的 EditPart 必须继承 activate() ,以便添加稍后必须除去的任何侦听器。通过继承 deactivate() 可除去那些相同的侦听器。

eg:

@Override

public void activate() {

if(!isActive()){

super.activate();

((ModelElement)getModel()).addPropertyChangeListener(this);

}

}

@Override

public void deactivate() {

if(isActive()){

super.deactivate();

((ModelElement)getModel()).removePropertyChangeListener(this);

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: