前两天也是在javaEye中看到一位大哥关于gef中连线抗锯齿的文章,学习之后感觉效果不错,如果你也正在用gef这个框架开发东西,不妨把下面这些代码加入,一定会让你的连线视觉效果好些~~
protected void refreshVisuals() {
super.refreshVisuals();
//以下这些代码是设置连接线抗锯齿
ConnectionLayer connectionLayer = (ConnectionLayer) getLayer(LayerConstants.CONNECTION_LAYER);
connectionLayer.setConnectionRouter(new ShortestPathConnectionRouter(figure));
//new ManhattanConnectionRouter()只能画垂直和水平线
//new FanRouter()若两结点间有两条线,就把他们分开表示~~
if ((getViewer().getControl().getStyle() & SWT.MIRRORED ) == 0)
connectionLayer.setAntialias(SWT.ON);
Animation.run(400);
}
首先说下上面这段代码加到哪里,一般来说用gef画图都会有一个容器类,也就是包含其它所有图形模型的模型,这样的话序列化反序列化都会很容易。那么就在这个容器模型对应的EditPart中覆盖registerVisuals() 方法,加上上面这些代码就可以了~~~是不是很简单。。。
再说说draw2d中的连线路由器ConnectionRouter,连线路由器决定了图形之间连线的路线。主要有以下几种
1.AutomaticRouter,这是一个抽象类,要用的话得用它的实现类FanRouter ,这个路由会判断两结点间是否有重复线,有的话会把重复的线分开, 变成两条线~~
2.BendpointConnectionRouter,增加连接线的路由点 ,让你的连线有路由点,从而可以方便的改变方向
3. ConnectionRouter.NullConnectionRouter,这是默认的路由,没增加特殊功能,一般用null表示就行,如下面的代码设成connectionLayer.setConnectionRouter(null),就可以了。
4. ManhattanConnectionRouter,这个路由能保证画出来的线是垂直或水平的,如果你需要这样的效果就可以设置成这个路由。
5. ShortestPathConnectionRouter 最短路径路由器,这个路由还是比较强大的,可以方便的避免连线穿越结点,它会以最近的路径绕开其它结点,完成连线。
当然了,如果以上这些路由都不能满足你的要求,你可以自定义一个路由器,只要实现ConnectionRouter接口即可,详细教程请参考http://www.ibm.com/developerworks/cn/opensource/os-ecl-gef/part2/index.html。
希望对大家有帮助~~~欢迎一起探讨~~