2017-04-18 2 views
1

J'ai un graphique avec 18 sommets et beaucoup d'arêtes. En raison du nombre d'éléments impliqués et de leur structure, les algorithmes intégrés disponibles (c'est-à-dire mxHierarchicalLayout utilisé pour l'image affichée) ne fonctionnent pas comme prévu, provoquant le chevauchement de la majorité des bords avec la description, comme illustré dans l'image Current status sample.JGraphX: Repositionner le terminal sur les sommets

Faire des tests et des contrôles dans le code source, je réussi à changer que peu de choses sur les bords creux de la géométrie du mxCell:

  • lable Edge
  • points de contrôle

Cependant Je ne trouve aucun moyen de manipuler le point des terminaux source et cible. Quelqu'un peut-il me suggérer les bonnes classes/méthodes à utiliser pour contrôler où le terminal devrait être connecté.

Toute aide/information serait appréciée.

Le code I réussi à tester pour manipuler les bords est le suivant:

.. 
    Arrays.asList(edges).stream().map(edge -> (mxCell) edge).forEach(edge -> { 
      mxGeometry newGeo = (mxGeometry) edge.getGeometry().clone(); 
      // TODO calculate condition 
      // This code actually move the label from the default 
      // position 
      mxPoint offset = new mxPoint(edge.getGeometry().getPoint().getX() + EDGE_OFFSET, 
        edge.getGeometry().getPoint().getY() + EDGE_OFFSET); 
      newGeo.setOffset(offset); 
      newGeo.setX(newGeo.getX() + 1); 
      if (newGeo.getPoints() != null) { 
       newGeo.getPoints().forEach(point -> { 
        point.setX(point.getX() + 200); 
        point.setY(point.getY() + 200); 
       }); 
      } 
      model.setGeometry(edge,newGeo); 
    }); 

Merci et salutations

Répondre

0

La position des bornes de source et de cible sont déterminés en fonction de la forme de la cellule et son frontière. Cela peut être obtenu en utilisant mxGraphView.getPerimeterPoint(cellState, point...), et qui utilise mxGraphView.getPerimeterFunction et mxGraphView.getPerimeterBounds.

Cela fonctionne bien pour un placement initial des étiquettes de bord (je l'utilise pour placer plusieurs étiquettes de bord - telles que les cardinalités dans les diagrammes de classes UML).

Toutefois, cette méthode utilise un mxCellState et, pour une raison inconnue, je ne sais pas encore, il ne peut pas être utilisé lors du repositionnement en utilisant un mxEventListener sur les événements de déplacement. les états de cellule sont toujours définis sur la position précédente de la cellule lorsque les événements sont déclenchés.