GEF中同时使用两个Router
来源:互联网 发布:tower mac 客户端 编辑:程序博客网 时间:2024/05/16 14:51
GEF中同时使用两个Router
http://www-128.ibm.com/developerworks/cn/opensource/os-ecl-gef/part2/
我现在做的这个项目需要在两个node之间同时存在多根线,如果不使用router的话就只能看见一根,在diagram的 figure里面set一个FanRouter作为缺省的router就可以解决这个问题.两个node之间如果存在多根连线的话,FanRouter会把它们分布成扇形,每根连线都可以看见.但是FanRouter好像只能在diagram的figure里面设置,如果每根connection你都设置成FanRouter,反而不会启效果,这可能跟它的handlecollision方法的算法有关.
但是设置成FanRouter之后有一个问题:我的项目中还有那种自连接的connection(该connection的source和target是同一个node),原先我是把这种connection的router设置为bendconnectionrouter,但是后来设置了FanRouter之后BendConnectionRouter好像就失效了,不管你的connection上面有多少个bendpoint都看不出来效果.
后来终于找到了让这两张router和平共处的办法,只要加一行:fanRouter.setNextRouter(new BendPointConnectionRouter());setNextRouter这个方法有点怪,按照字面的理解,应该是fanrouter的下一个router,按理说应该是先用fanrouter来layout 连线,然后再使用BendPointConnectionRouter来layout 连线,但是它实际上是先用BendPointConnectionRouter来layout 连线,然后再使用fanRouter.
前两天也是在javaEye中看到一位大哥关于gef中连线抗锯齿的文章,学习之后感觉效果不错,如果你也正在用gef这个框架开发东西,不妨把下面这些代码加入,一定会让你的连线视觉效果好些~~ protected void refreshVisuals() { 首先说下上面这段代码加到哪里,一般来说用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。 希望对大家有帮助~~~欢迎一起探讨~~Draw2d中的连线路由器及gef中连线抗锯齿
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中同时使用两个Router
- GEF 进阶,第二部分: Router
- Servlet中PrintWriter和OutputStream两个流不能同时使用
- jRegistry.dll在两个项目中同时使用无法加载
- jsp中使用<c:foreach>同时遍历两个list集合
- CodeIgniter中Router类的两个方法
- Backbone中Router的使用
- vue中使用vue-router
- zstack同时使用两个串行口
- ZStack同时使用两个串口
- 两个无线路由同时使用
- GEF中组合按键设置汇总以及org.eclipse.gef.KeyStroke的方法的使用
- extJs中一个viewport中, 使用一个请求, 同时显示两个gridPanel
- GEF中常用策略
- GEF中命令模式
- C#中同时操作两个数据库
- WinForm中两个DataGridView同时滚动
- VC6中两个对话框的同时显示
- be to do, be going to do, be about to do的区别
- POJ_3009_Curling 2.0
- 小智力题[1]
- 一些关于speechlib tts 的用法
- 热闹的世界杯
- GEF中同时使用两个Router
- 分析问题是解决问题的前提
- 用户体验的要素
- 解决perl 调用system返回值问题
- MyEclipse8.5 SVN插件安装
- DateTextBox 日期选择
- 用户 'NT AUTHORITY/NETWORK SERVICE' 登录失败解决方法
- android布局器
- 我要长大了!!