2017-02-27 1 views
1

J'utilise le JGraphX ​​mxCompactTreeLayout qui me donne par défaut la disposition comme indiqué par (A) sur l'image ci-dessous. Je voudrais savoir s'il est possible de réaliser ce qui est montré par (B) avec JGraphX. La raison d'une telle exigence est que le graphique semble encombré s'il y a beaucoup d'arêtes provenant de la même source.Formatage des bords JGraphX ​​

Layouts

+0

Est-ce mxGraph (JavaScript) ou JGraphX ​​(Java Swing)? – David

+0

@David c'est JGraphX. – ntombela

+0

@ntombela, s'il vous plaît, partager [MCVE] (http://stackoverflow.com/help/mcve) – Enigo

Répondre

1

Utilisation du EDGESTYLE_ELBOW est pas une mauvaise option, mais si vous souhaitez utiliser la mise en page, vous pouvez probablement adapter ce qui suit.

Le CompactTreeLayout crée un bord de trois points. Si vous étendez la mise en page, vous pouvez modifier les deux premiers points du bord pour qu'ils correspondent au point milieu x des limites du sommet source. Voici un exemple d'option de disposition verticale du CompactTreeLayout.

import java.util.List; 
import java.util.Map; 

import javax.swing.JFrame; 

import mxgraph.layout.mxCompactTreeLayout; 
import mxgraph.layout.mxIGraphLayout; 
import mxgraph.model.mxGraphModel; 
import mxgraph.model.mxICell; 
import mxgraph.swing.mxGraphComponent; 
import mxgraph.util.mxConstants; 
import mxgraph.util.mxPoint; 
import mxgraph.util.mxRectangle; 
import mxgraph.view.mxGraph; 

public class FormatEdges extends JFrame 
{ 

    public FormatEdges() { 
      mxGraph graph = new mxGraph(); 
      Object parent = graph.getDefaultParent(); 

      Map<String, Object> edgeStyle = graph.getStylesheet().getDefaultEdgeStyle(); 
      edgeStyle.put(mxConstants.STYLE_ENDARROW, mxConstants.NONE); 

      graph.getModel().beginUpdate(); 
      try 
      { 
       // Create vertexes 
       Object vertex1 = graph.insertVertex(parent, null, "01", 10, 20, 80, 30); 
       Object vertex2 = graph.insertVertex(parent, null, "010", 10, 20, 80, 30); 
       Object vertex3 = graph.insertVertex(parent, null, "011", 10, 20, 80, 30); 
       Object vertex4 = graph.insertVertex(parent, null, "B", 115, 200, 50, 50, "shape=ellipse"); 

       // Connect 
       mxICell edge1 = ((mxICell)(graph.insertEdge(parent, "01", "", vertex1, vertex2))); 
       mxICell edge2 = ((mxICell)(graph.insertEdge(parent, "02", "", vertex1, vertex3))); 

       // Layout 
       mxIGraphLayout layout = new ExtendedCompactTreeLayout(graph); 
       layout.execute(parent); 
      } finally 
      { 
       graph.getModel().endUpdate(); 
      } 

      mxGraphComponent graphComponent = new mxGraphComponent(graph); 
      getContentPane().add(graphComponent); 
    } 

    public static void main(String[] args) 
    { 
     FormatEdges frame = new FormatEdges(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setSize(400, 320); 
     frame.setVisible(true); 
    } 

    public class ExtendedCompactTreeLayout extends mxCompactTreeLayout 
    { 

     public ExtendedCompactTreeLayout(mxGraph graph) { 
      super(graph, false); 
      super.prefVertEdgeOff = 0; 
     } 

     @Override 
     public void execute(Object parent) 
     { 
      // Execute the CompactTreeLayout 
      super.execute(parent); 

      // Modify the edges to ensure they exit the source cell at the midpoint 
      if(!horizontal) 
      { 
       // get all the vertexes 
       Object[] vertexes = ((mxGraphModel)graph.getModel()).getChildVertices(graph.getModel(), graph.getDefaultParent()); 
       for(int i=0; i < vertexes.length; i++) 
       { 
        mxICell parentCell = ((mxICell)(vertexes[i])); 
        // For each edge of the vertex 
        for(int j=0; j < parentCell.getEdgeCount(); j++) 
        { 
         mxICell edge = parentCell.getEdgeAt(j); 
         // Only consider edges that are from the cell 
         if(edge.getTerminal(true) != parentCell) 
         { 
          continue; 
         } 
         mxRectangle parentBounds = getVertexBounds(parentCell); 
         List<mxPoint> edgePoints = edge.getGeometry().getPoints(); 

         // Need to check that there is always 3 points to an edge, but this will get you started 
         mxPoint outPort = edgePoints.get(0); 
         mxPoint elbowPoint = edgePoints.get(1); 
         if(outPort.getX() != parentBounds.getCenterX()) 
         { 
          outPort.setX(parentBounds.getCenterX()); 
          elbowPoint.setX(parentBounds.getCenterX()); 
         } 
        } 
       } 
      }    
     } 
    } 
} 

Resulting Layout Image

+0

Merci Dan. Je vais apporter ma contribution en mettant en œuvre le scénario vertical. – ntombela