在类图里能看到一些对象具有对自己的引用,通常这些引用用于表达树状结构,即父子节点都是同一类对象。用GEF绘制这样的连接线一般是通过转折点(Bendpoint)实现的,如果你的GEF应用程序里还不能使用Bendpoint,请按照上一篇介绍的步骤添加对Bendpoint的支持。
原先我们的GefPractice应用程序是不允许一条连接线的起点和终点都是同一个图形的,因为这样会导致连接线缩成一个点隐藏在图形下方,用户并不知道它的存在。当时我们在CreateConnectionCommand类的canExecute()方法里进行了如下判断:
public
boolean
canExecute() {
if (source.equals(target))
return false ;
}
if (source.equals(target))
return false ;
}
因此现在首先要把这两句删除。然后在execute()方法里对自身连接的这种情况稍做处理,处理的方法是给这条连接线在适当位置增加三个Bendpoint,你也可以根据想要的连接线形状修改Bendpoint的数目和位置。
public
void
execute() {
connection = new Connection(source, target);
if (source == target) {
// The start and end points of our connection are both at the center of the rectangle,
// so the two relative dimensions are equal.
ConnectionBendpoint cbp = new ConnectionBendpoint();
cbp.setRelativeDimensions( new Dimension( 0 , - 60 ), new Dimension( 0 , - 60 ));
connection.addBendpoint( 0 , cbp);
ConnectionBendpoint cbp2 = new ConnectionBendpoint();
cbp2.setRelativeDimensions( new Dimension( 100 , - 60 ), new Dimension( 100 , - 60 ));
connection.addBendpoint( 1 , cbp2);
ConnectionBendpoint cbp3 = new ConnectionBendpoint();
cbp3.setRelativeDimensions( new Dimension( 100 , 0 ), new Dimension( 100 , 0 ));
connection.addBendpoint( 2 , cbp3);
}
}
connection = new Connection(source, target);
if (source == target) {
// The start and end points of our connection are both at the center of the rectangle,
// so the two relative dimensions are equal.
ConnectionBendpoint cbp = new ConnectionBendpoint();
cbp.setRelativeDimensions( new Dimension( 0 , - 60 ), new Dimension( 0 , - 60 ));
connection.addBendpoint( 0 , cbp);
ConnectionBendpoint cbp2 = new ConnectionBendpoint();
cbp2.setRelativeDimensions( new Dimension( 100 , - 60 ), new Dimension( 100 , - 60 ));
connection.addBendpoint( 1 , cbp2);
ConnectionBendpoint cbp3 = new ConnectionBendpoint();
cbp3.setRelativeDimensions( new Dimension( 100 , 0 ), new Dimension( 100 , 0 ));
connection.addBendpoint( 2 , cbp3);
}
}
现在用户只要选择连接工具,然后在一个节点上连续点两下就可以创建自身连接了,如下图所示。
自身连接
点此下载工程,此工程修改自GEF常见问题2中的GefPractice-bp,目标文件扩展名为.gefpracticesc。
本文转自博客园xingoo的博客,原文链接:GEF常见问题3:自身连接,如需转载请自行联系原博主。