/* * (C) Copyright 2013-2018, by Barak Naveh and Contributors. * * JGraphT : a free Java graph-theory library * * See the CONTRIBUTORS.md file distributed with this work for additional * information regarding copyright ownership. * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License 2.0 which is available at * http://www.eclipse.org/legal/epl-2.0, or the * GNU Lesser General Public License v2.1 or later * which is available at * http://www.gnu.org/licenses/old-licenses/lgpl-2.1-standalone.html. * * SPDX-License-Identifier: EPL-2.0 OR LGPL-2.1-or-later */ package org.ntlab.deltaViewer; import com.mxgraph.model.mxCell; import com.mxgraph.swing.*; import com.mxgraph.util.mxConstants; import com.mxgraph.util.mxLine; import com.mxgraph.util.mxPoint; import com.mxgraph.view.mxGraph; import org.jgrapht.ext.*; import org.jgrapht.graph.*; import javax.swing.*; import java.awt.*; import java.awt.geom.Ellipse2D; /** * A demo applet that shows how to use JGraphX to visualize JGraphT graphs. Applet based on * JGraphAdapterDemo. * */ public class JGraphTSample extends JApplet { private static final Dimension DEFAULT_SIZE = new Dimension(530, 320); private JGraphXAdapter<String, DefaultEdge> jgxAdapter; /** * An alternative starting point for this demo, to also allow running this applet as an * application. * * @param args Command line arguments. */ /** * @param args */ public static void main(String[] args) { //Build a frame, create a graph, and add the graph to the frame so you can actually see the graph. JFrame frame = new JFrame("Branching graph"); frame.setSize(500, 500); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); mxGraph mxgraph= new mxGraph(); mxGraphComponent graphComponent= new mxGraphComponent(mxgraph); frame.add(graphComponent, BorderLayout.CENTER); frame.setVisible(true); //No clue what this does but it is needed. Object mxDefaultParent = mxgraph.getDefaultParent(); //Add a vertex to the graph in a transactional fashion. The vertex is actually a 'cell' in jgraphx terminology. Object vertex=null; Object A=null; Object B=null; Object C=null; Object D=null; Object E=null; Object Am=null; Object Bm=null; Object Dm=null; Object Em=null; Object b=null; Object c=null; Object d=null; Object e=null; Object AmE=null; Object BmE=null; Object DmE=null; mxgraph.getModel().beginUpdate(); try{ double xCor=225; double yCor=100.0; double width=70; double height=70; A=mxgraph.insertVertex(mxDefaultParent, "A", "A", xCor, yCor, width , height,"fillColor=blue"); //creates a blue vertex B=mxgraph.insertVertex(mxDefaultParent, "B", "B", xCor-100, yCor+100, width, height,"fillColor=blue"); C=mxgraph.insertVertex(mxDefaultParent, "C", "C", xCor-200, yCor+200, width , height,"fillColor=blue"); D=mxgraph.insertVertex(mxDefaultParent, "D", "D", xCor+100, yCor+100, width , height,"fillColor=blue"); E=mxgraph.insertVertex(mxDefaultParent, "E", "E", xCor+200 , yCor+200, width, height,"fillColor=blue"); Am=mxgraph.insertVertex(mxDefaultParent, "Am", "A.m()", getXForCell(mxgraph, "A")+10, yCor+40, width-15 , height-40,"fillColor=blue; alignVertical=middle"); //creates a blue vertex Bm=mxgraph.insertVertex(mxDefaultParent, "Bm", "B.getC()", getXForCell(mxgraph, "B")+10, yCor+140, width-15, height-50,"fillColor=blue"); Dm=mxgraph.insertVertex(mxDefaultParent, "Dm", "D.passB()", getXForCell(mxgraph, "D")+10, yCor+140, width-15 , height-50,"fillColor=blue"); Em=mxgraph.insertVertex(mxDefaultParent, "Em", "E.setC()", getXForCell(mxgraph, "E")+10 , yCor+240, width-15, height-50,"fillColor=blue"); b = mxgraph.insertEdge(mxDefaultParent, "b", "b", A, B, "edgeStyle=elbowEdgeStyle;elbow=horizontal;" + "exitX=0.5;exitY=1;exitPerimeter=1;entryX=-10;entryY=-10;entryPerimeter=1;"); c = mxgraph.insertEdge(mxDefaultParent, "c", "c", B, C); d = mxgraph.insertEdge(mxDefaultParent, "d", "d", A, D); e = mxgraph.insertEdge(mxDefaultParent, "e", "e", D, E); AmE = mxgraph.insertEdge(mxDefaultParent, "AmE", "", Am, Bm); BmE = mxgraph.insertEdge(mxDefaultParent, "BmE", "", Bm, Dm); DmE = mxgraph.insertEdge(mxDefaultParent, "DmE", "", Dm, Em); final Graphics2D g = (Graphics2D)graphComponent.getGraphics(); // mxGraphics2DCanvas canvas = new mxGraphics2DCanvas(g); // canvas.paintPolyline(new mxPoint[] {new mxPoint(100,100),new mxPoint(500,500)}, true); Runnable r = new Runnable() { public void run() { g.setColor(Color.GREEN); Stroke dashed = new BasicStroke(1, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL, 0, new float[]{9}, 0); g.setStroke(dashed); g.drawLine(0, 0, 500, 500); } }; if (!SwingUtilities.isEventDispatchThread()) { SwingUtilities.invokeLater(r); } else { r.run(); } } finally{ mxgraph.getModel().endUpdate(); } /*Given a cell, we can change it's style attributes, for example the color. NOTE that you have to call the graphComponent.refresh() function, otherwise you won't see the difference!*/ mxgraph.setCellStyles(mxConstants.STYLE_FILLCOLOR, "white", new Object[]{A, B, C, D, E, Am, Bm, Dm, Em}); //changes the color to red mxgraph.setCellStyles(mxConstants.STYLE_SHAPE, mxConstants.SHAPE_ELLIPSE, new Object[]{A, B, C, D, E}); mxgraph.setCellStyles(mxConstants.STYLE_PERIMETER, mxConstants.PERIMETER_ELLIPSE, new Object[]{A, B, C, D, E}); mxgraph.setCellStyles(mxConstants.STYLE_EDGE, mxConstants.SHAPE_CURVE, new Object[] {AmE, BmE, DmE, b, c, d, e}); mxgraph.setCellStyleFlags(mxConstants.STYLE_DASHED, 1, true, new Object[] {AmE, BmE, DmE}); // Adds animation to edge shape and makes "pipe" visible ((mxCell)b).setAttribute("path", ".flow {" + "stroke-dasharray: 8;" + "animation: dash 0.5s linear;" + "animation-iteration-count: infinite;" + "}" + "@keyframes dash {" + "to {" + "stroke-dashoffset: -16;" + "}"); graphComponent.refresh(); } private static double getXForCell(mxGraph graph, String id) { double res = -1; graph.clearSelection(); graph.selectAll(); Object[] cells = graph.getSelectionCells(); for (Object object : cells) { mxCell cell = (mxCell) object; if (id.equals(cell.getId())) { res = cell.getGeometry().getX(); } } graph.clearSelection(); return res; } class GPanel extends JPanel { @Override public void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2 = (Graphics2D)g; int w = this.getWidth(); int h = this.getHeight(); for(int i = 0;i < 10;i++){ Ellipse2D shape = new Ellipse2D.Double(0,0,w,h - i * (w / 10)); g2.setPaint(new Color(0,0,255,25)); g2.fill(shape); } } } }