快捷搜索:

GEF常见问题5:自动布局

本文示例源代码或素材下载

使用自动结构功能,我们可以把原先不包孕图形信息的文件以图形化的要领展示出来,范例的例子比如将一组Java接口反向工程为类图,那么图中每个图元的坐标应该必须都是自动天生的。GEF里供给了DirectedGraphLayout类用来实现自动结构功能,下面先容一下如何在法度榜样里应用它。

DirectedGraphLayout供给的visit()措施吸收一个org.eclipse.draw2d.graph.DirectedGraph实例,它遍历这个有向图的所有节点和边,并按照它自己的算法谋略出每个节点结构后的新位置。以是在应用它结构画布上的图元分为两个步骤:1、构造有向图,2、将结构信息利用到图元。

照样以gefpractice为根基,我们在主对象条上增添了一个自动结构按钮,当用户按下它时自动结构编辑器里的图形,再次按下时规复曩昔的结构。为了完成步骤1,我们要在DiagramPart里添加以下两个措施:

/**

*将图元(NodePart)转换为节点(Node)到有向图

*@paramgraph

*@parammap

*/

publicvoidcontributeNodesToGraph(DirectedGraphgraph,Mapmap){

for(inti=0;i

要实现步骤2,在DiagramPart里添加下面这个措施:

/**

*使用结构后的有向图里节点的位置信息从新定位画布上的图元

*@paramgraph

*@parammap

*/

protectedvoidapplyGraphResults(DirectedGraphgraph,Mapmap){

for(inti=0;i

为了以起码的代码阐明问题,上面的措施里只是简单的移动了图形,而没有改变模型里Node的属性值,在大年夜多环境下这里应用一个CompoundCommand对模型进行改动更为相宜,这样用户不仅可以取缔(Undo)这个自动结构操作,还可以在从新打开文件时看到关闭前的样子。留意,DirectedGraphLayout是不包管每次结构都获得完全相同的结果的。

由于Draw2D里是用LayoutManager治理结构的,而DirectedGraphLayout只是对结构算法的一个包装,以是我们还要创建一个结构类。GraphLayoutManager调用我们在上面已经添加的那几个措施天生有向图(partsToNodes变量掩护了编辑器图元到有向图图元的映射),使用DirectedGraphLayout对这个有向图结构,再把结果利用到编辑器里图元。如下所示:

classGraphLayoutManagerextendsAbstractLayout{

privateDiagramPartdiagram;

GraphLayoutManager(DiagramPartdiagram){

this.diagram=diagram;

}

protectedDimensioncalculatePreferredSize(IFigurecontainer,intwHint,inthHint){

container.validate();

Listchildren=container.getChildren();

Rectangleresult=newRectangle().setLocation(container.getClientArea().getLocation());

for(inti=0;i

您可能还会对下面的文章感兴趣: