在FigureCanvas上的现有节点之间绘制PolylineConnection

时间:2014-01-09 06:29:36

标签: java eclipse-rcp draw2d

我有要绘制的节点列表。这个节点意味着RectangleFigure。所以,所有这些节点首先在画布上绘制(FigureCanvas) 然后我有一个地图,维护前面绘制的节点之间的依赖关系。 在映射中,键是节点,值只是维护的节点列表。

e.g。有3个节点,[ClassA,ClassB,InterfaceC]

我把它们画在画布上。 我的地图如下: [ClassA = [ClassB],ClassB = [InterfaceC]] 因此,它意味着ClassA extends ClassBClassB implements InterfaceC

现在,我想在已经绘制的节点之间绘制PolylineConnection,使用维护的地图。 那么,我该如何处理呢?

任何指针都非常感谢,提前致谢!

2 个答案:

答案 0 :(得分:1)

作为draw2d项目的一部分,有很多例子。请在此处查看详细信息:http://nyssen.blogspot.de/2010/12/draw2d-examples-hidden-treasure.html

答案 1 :(得分:1)

尝试解决问题的方法,并且有效。所以,为自己的问题添加答案。

步骤如下: - 1.考虑问题本身的例子。  有3个节点,[ClassA,ClassB,InterfaceC] 我们在这些节点中有一个关系图  [ClassA = [ClassB],ClassB = [InterfaceC]] 表示ClassA extends ClassB和      ClassB implements InterfaceC

  1. 从地图中一次取一个密钥,然后将该节点作为PolylineConnection的来源获取。
  2. 然后对同一个源(地图中的键)获取节点,逐个值作为目标节点。
  3. 现在我们同时拥有源节点和目标节点,我们可以使用Anchors
  4. 在两者之间绘制连接

    获取节点的逻辑如下: -

    1. 在一个列表中获取画布上绘制的所有子项,如果子项类型为RectangleFigure(节点),则比较给定的标签,我们可以获取所需的节点。
    2. 代码段以获得更多说明

      private RectangleFigure fetchNode(String node_label) {
              RectangleFigure emptyNode = new RectangleFigure();
              // get the list of nodes drawn on canvas
              @SuppressWarnings("rawtypes")
              List childrens = panel.getChildren();  //private IFigure panel;
      
              for (int count = 0; count < childrens.size(); count++) {
                  if (childrens.get(count) instanceof RectangleFigure) {
                      RectangleFigure node = (RectangleFigure) childrens.get(count);
                      @SuppressWarnings("rawtypes")
                      List node_children = node.getChildren();
                      for (int count2 = 0; count2 < node_children.size(); count2++) {
                          if (node_children.get(count2) instanceof Label) {
                              Label lbl = (Label) node_children.get(count2);
                              if (lbl.getText().equals(node_label)) {
                                  return node;
                              }
                          }
                      }
                  }
              }
      
              return emptyNode;
          }