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);
}
}