Eclipse GEF 风扇路由器

Eclipse GEF FanRouter

我正在使用 GEF 创建一个可视化文件之间依赖关系的工具。我成功地建立了节点之间的连接,我还可以切换功能以使用 ManhattenConnectionRouter.

但是我发现使用 FanRouter 有问题。

我尝试按照 GEF 提供的逻辑示例进行操作,但我仍然遇到问题。遗憾的是,没有其他教程展示如何实现 FanRouter

以下是我的代码摘录:

基础class,实现FreeformLayer

public class DependencyGraphPart extends AbstractGraphicalEditPart implements LayerConstants {

    private DependencyGraphAdapter adapter;

    public DependencyGraphPart(){
        super();
        adapter = new DependencyGraphAdapter();
    }

    @Override protected IFigure createFigure() {
        FreeformLayer layer = new FreeformLayer();
        layer.setLayoutManager(new FreeformLayout());
        layer.setBorder(new LineBorder(1));

        return layer;
    }

    @Override protected void refreshVisuals(){
        ConnectionLayer cLayer = (ConnectionLayer) getLayer(CONNECTION_LAYER);
        cLayer.setAntialias(SWT.ON);
        AutomaticRouter frouter = new FanRouter();
        cLayer.setConnectionRouter(frouter);
    }

这是我的 ConnectionClass:

public class DCDependencyPart extends AbstractConnectionEditPart{       
    private DCDependencyAdapter adapter;
    private Label label;

    public DCDependencyPart() {
        super();
        adapter = new DCDependencyAdapter();
    }

    @Override protected void createEditPolicies() {
        installEditPolicy(EditPolicy.CONNECTION_ENDPOINTS_ROLE, new ConnectionEndpointEditPolicy());
    }

    @Override
    protected IFigure createFigure(){
        PolylineConnection conn = new PolylineConnection();
        conn.setLineWidth(conn.getLineWidth()*2);
        conn.setConnectionRouter(new FanRouter());
        conn.setTargetDecoration(new PolylineDecoration());
        conn.setToolTip(new TooltipFigure());

        label = new Label("1"); 
        label.setOpaque(true); 
        label.setBackgroundColor(ColorConstants.buttonLightest); 
        label.setBorder(new LineBorder()); 
        conn.add(label, new MidpointLocator (conn, 0)); 

        return conn;
    }

当我尝试实现 ManhattenConnectionRouter 时,只需将它添加到 Connection-class 就没有遇到任何问题。 (没有修改DependencyGraphPart

这是我积极使用任何 Router 的两个地方。 不幸的是,我不太了解 draw2d and/or GEF,无法找到我的问题。

FanRouter 是处理冲突的路由器。它需要 "next" 路由器,它可以是 BendpointConnectionRouter,例如,它可以完成布置连接的所有艰苦工作。 一旦 Fanrouter 布局了一个连接,它将首先使用 "next" 路由器进行实际的连接布局,然后检查该连接是否与具有相同源和目标的任何其他连接重叠,如果是,它将引入额外的弯点以确保连接不会相互重叠。 下面是正确使用 FanRouter 的例子:

AutomaticRouter router = new FanRouter();
router.setNextRouter(new BendpointConnectionRouter());
connectionLayer.setConnectionRouter(router);