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

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

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值