GEF中文教程 自学笔记 7

目标:1. 删除连接
2. 连接的重新定向
3. 显示与操作连接的控制点bendpoint

删除连接的要点
删除连接时产生REQ_DELETE请求。使用ConnectionEditPolicy重载getDeleteCommand方法创建相应的command来处理这种请求。这个EditPolicy安装在连接控制器中(ConnectionEditPart),Role是EditPolicy.CONNECTION_ROLE
它非常类似与删除HelloModel,下文摘自前面的笔记:
“用户发出Delete命令时,会生成REQ_DELETE请求,GEF提供了ComponentEditPolicy来处理REQ_DELETE类型的请求,重载createDeleteCommand方法使其生成DeleteCommand。”“Role是EditPolicy.COMPONENT_ROLE。

重新定向连接的要点
首先要把ConnectionEndpointEditPolicy安装到连接控制器中,以使得可以选中连接的端点(是锚点吗?)
    installEditPolicy(EditPolicy.CONNECTION_ENDPOINTS_ROLE, new CustomConnectionEndpointEditPolicy());

连接的重新定向涉及到节点,所以和创建连接一样交给GraphicalNodeEditPolicy负责。重载getReconnectSourceCommand方法和getReconnectTargetCommand方法创建恰当的命令。

显示与操作连接的控制点的要点
ConnectionRouter接口用来确定连接的路径(即连接是怎样走的,或者说怎么布线的)。BendpointConnectionRouter是该接口的一个实现类,它使用一系列的连接的控制点bend points来确定连接的路径

首先要为连接对应的figure设置ConnectionRouter:
    polylineConnection.setConnectionRouter(new BendpointConnectionRouter());

我们的连接模型需要管理这些bend points,并且在它们发生改变时通知控制器。控制器要能接受这些通知,刷新视图。
    protected void refreshBendpoints() {
        List bendpoints = ((AbstractConnectionModel) getModel()).getBendpoints();
        List constraint = new ArrayList();

        for (int i = 0; i < bendpoints.size(); i++) {
            constraint.add(new AbsoluteBendpoint((Point) bendpoints.get(i)));
        }
        getConnectionFigure().setRoutingConstraint(constraint);
    }
(教程中说重载refreshVisuals方法调用refreshBendpoints是为了防止NullPointerException,这是不正确的。实际的用处是为了打开editor时就能显示正确的连接路径,可以想象一下打开一个保存了的设置过bendpoints的文件)

BendpointEditPolicy用来管理控制点bend points的操作。它需要安装到ConnectionEditPart中,Role是EditPolicy.CONNECTION_BENDPOINTS_ROLE

控制点是有顺序index的。这很容易理解,因为画线时就是按照起点-各控制点-终点的顺序连接各个点的。
source----(index 0 if insert here)----bend 0----(index 1)----bend 1----(index 2)----bend 2----(index 3)----target
已经存在的bend points的index用蓝色表示,可新建的bend point位置就是括号表示的4个位置。删除和重设bend point时request里面的index值就是蓝色的index值;新建bend point时request里面得index值就是对应位置上橙色的index值。

最后一点是关于相对位置与绝对位置的。上面代码中我们创建了AbsoluteBendpoint作为constraint,它记录的是绝对位置。当我们操作控制点时,我们需要的是相对位置,所以必须通过Connection类提供的translateToRelative方法转化为相对位置。(这段我自己都不相信= =!!,等研究过draw2d再回过头来看吧)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值