Router路由:设定线的轨迹,在Connection接口中定义了添加路由的方式,所以实现了Connection接口的Figure都可以添加路由。另外在ConnectionLayer中有一个方法,是为此Layer下的所有实现了Connection接口的Figure添加一个路由。当然,我们还可以自定义一些Figure添加路由。
?
ConnectionRouter接口:路由的基础接口,所有的路由必须实现此接口。
?
以下是draw2D中常用的几个路由:
1.NullConnectionRouter:ConnectionRouter接口默认提供的实现,直线路由,其实就是不设定任何规则。
?
2<span style="color: #333333;">.</span><span style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px;">[size=medium;][size=small;]<span style="color: #ff0000;">AutomaticRouter[/size],这是一个抽象类,要用的话得用它的实现类[/size]</span><a style="color: #336699; text-decoration: none;" title="class in org.eclipse.draw2d" href="http://writeblog.csdn.net/org/eclipse/draw2d/FanRouter.html">[size=medium; color: #ff0000;][size=small;]FanRouter[/size][/size]</a>[size=medium;][size=small;]?,这个路由会判断两结点间是否有重复线,有的话会把重复的线分开,? 变成两条线~~[/size][/size]</span>
?
<span style="color: #333333; font-family: Arial; line-height: 26px; font-size: small;">3.<span style="color: #ff0000;">BendpointConnectionRouter</span>,
<span style="color: #000000;">增加连接线的路由点 ,让你的连线有路由点,从而可以方便的改变方向</span></span>
?
4.<span style="color: #333333; font-family: Arial; line-height: 26px; font-size: small;">?<span style="color: #ff0000;">ManhattanConnectionRouter</span>,这个路由能保证画出来的线是垂直或水平的,如果你需要这样的效果就可以设置成这个路由。</span>
?
<span style="color: #333333; font-family: Arial; line-height: 26px; font-size: small;">5.?<span style="color: #ff0000;">ShortestPathConnectionRouter</span>?最短路径路由器,这个路由还是比较强大的,可以方便的避免连线穿越结点,它会以最近的路径绕开其它结点,完成连线。</span>
?
?
自定义路由的实现思路:
<span style="font-family: arial, nsimsun, sans-serif;">显然我们无法凭空的计算出线路的走向,一条连线的具体路线和很多因素有关,比如锚点、图形的位置和大小,图形之间的相互关系,等等。所以我们需要能够访问到这些必须的信息,在Connection接口中,我们有getTargetAnchor()和getSourceAnchor()可以让我们得到锚点,而在ConnectionAnchor接口中(参见本系列第一部分),我们有getOwner()这样的方法,可以得到图形。这些必要的方法为我们实现路由器提供了可能。</span>
?
Object getConstraint(Connection connection);
void setConstraint(Connection connection, Object constraint);
void invalidate(Connection connection);
void route(Connection connection);
void remove(Connection connection);
?
<span style="font-family: arial, nsimsun, sans-serif;">setConstraint和getConstraint用来设置/得到连接上的Constraint(约束),所谓Constraint是指加在某个连线上的一些参数。我们可以看到constraint是一个Object类型,因为不同的路由器可能对constraint有不同的要求,对于ShortestPathConnectionRouter来说,constraint需要是一个List对象,里面包含了所有的转折点。</span>
<span style="font-family: arial, nsimsun, sans-serif;">invalidate方法可以将一个连线置为无效,这样在下一次布局操作时,无效的连接将被重新路由。remove方法是将连线从路由器中删除,也就是路由器不会再负责这条连线的布局,一般只有在删除一条连线的时候才会调用到,我们可以在里面做一些清除工作,比如释放和连线相关的cache。route方法是路由操作真正发生的地方,我们一般只需要实现route方法就可以了,如果你还想做一些其他的操作,可以考虑实现其他方法。同样,一般是不推荐直接实现ConnectionRouter接口的,我们可以继承AbstractRouter类,这个类提供了一些简单的或者空的实现,还提供了两个额外的方法getStartPoint()和getEndPoint()方便我们得到连线的两个端点。</span>
?
public void route(Connection conn) {
// 清空连线的所有点
PointList points = conn.getPoints();
points.removeAllPoints();
// 得到目标和源参考点
Point sourceRef = conn.getSourceAnchor().getReferencePoint();
Point targetRef = conn.getTargetAnchor().getReferencePoint();
A_POINT.setLocation(sourceRef.x, targetRef.y);
// 得到起始点和结束点
Point startPoint = conn.getSourceAnchor().getLocation(A_POINT);
Point endPoint = conn.getTargetAnchor().getLocation(A_POINT);
// 添加起始点
A_POINT.setLocation(startPoint);
conn.translateToRelative(A_POINT);
points.addPoint(A_POINT);
// 添加转折点
A_POINT.setLocation(sourceRef.x, targetRef.y);
conn.translateToRelative(A_POINT);
points.addPoint(A_POINT);
// 添加结束点
A_POINT.setLocation(endPoint);
conn.translateToRelative(A_POINT);
points.addPoint(A_POINT);
// 设置连线经过的所有点
conn.setPoints(points);
}
?
<span style="font-family: arial, nsimsun, sans-serif;">一条连线实际上是通过一系列的点来描述的,而route方法的实际任务也就是计算出这些点的位置。所以我们一开始就得到了这条连线的点序列(PointList对象),然后清空它,重新计算这些点。在我们这个路由器的设计里,一条连线由三个点组成:分别是起始点,转折点和结束点,它们构成了两条垂直的直线。起始点和结束点(也就是锚点)我们都已经了解如何得到了,中间的转折点,也很容易得出,我们就不解释了。要指出的是,我们需要把它们的坐标转换为相对坐标再添加,同时在添加完成之后,我们还需要调用setPoints()方法,这样才会生效。</span>