今天有幸碰到关于Connection以及Router使用的问题。觉得有点意思就把它记了下来。以背后查。
看到一个例子中看到图
-- 1所示的功能。
其中图-1中的连线是自适应的会保持该线段是最短的(其实他是使用的ShortestPathConnectionRouter,这个时候我还不知道,我是一个新手大家见笑了)。经过一番调查以后发现原来是在EditPart中的refreshVisuals方法中有如下代码。
代码--1
if
(spRouter
==
null
) {
ConnectionLayer cLayer
=
(ConnectionLayer) getLayer(LayerConstants.CONNECTION_LAYER);
FanRouter router
=
new
FanRouter();
router.setSeparation(
30
);
spRouter
=
new
ShortestPathConnectionRouter(getFigure());
router.setNextRouter(spRouter);
cLayer.setConnectionRouter(router);
}
当时就猜啊,他肯定是在给一个特定的Layer加上一个什么玩意。然后就通过这个玩意来完成对于路径的计算(其实这些东西完全是从代码的字面意思而得到的)。我这些东西加到我的代码中了。但是我运行的效果还是没有起作用。他依旧是以前的那幅得行。我抓,抓也没有用。就是达不到我要的效果。
抱着试一下的想法我打开了我的ConnectionEditPart(就是连线的那个EditPart),发现在createFigure中我是这么写的。
代码 --
2
PolylineConnection connection
=
(PolylineConnection)
super
.createFigure();
connection.setConnectionRouter(
new
BendpointConnectionRouter(){
public
void
route(Connection conn) {
GraphAnimation.recordInitialState(conn);
if
(
!
GraphAnimation.playbackState(conn))
super
.route(conn);
}
});
很明显我在这里给connection赋了一个ConnectionRouter。最终其效果的是这一个ConnectionRouter起作用了。
Md刚掉他就万事大吉了。
到这里代码部分其实就完了。但是他背后的还有一点故事。
这里有三个角色:
1、Connection
2、ConnectionAnchor.
3
、
ConnectionRouter
这个类是用来显示两点之间的线段
(Line),
他的起点和终点是通过
ConnectionAnchor
来定义的。至于他的其他点是通过
ConnectionRouter
计算设置的。从这个地方来看
ConnectionRouter
是一个负责计算的工具类。这样完全可以让所有的
Connection
使用一个
ConnectionRouter
实例(这就是今天最要记下的部分)。
在
gef
中他就为我们提供了这样的机制。下面的这段话是
Gef
help
中的一句话。他就说明了这个道理。
A
convenient way to share the router with all connections and to place
connections above the drawing is to use a ConnectionLayer
.
The layer has a connection router property which it shares with every
child that's a connection. You can update this property and easily
change every connection's router at once.
这个道理要转换成代码的话就是代码
–
1
了。
这个东西很简单。希望对像我一样的新手有点帮助。