2016-12-10 8 views
0

Ich arbeite mit JGraphT-Bibliothek, um ein Diagramm für meine Baumstruktur zu zeichnen, aber die Bibliothek zeichnet ein Diagramm basierend auf einer bestimmten Menge von Knoten und verbundenen Kanten. Ich habe die Klasse "DirectedAcyclicGraph.VisitedArrayListImpl" in der Bibliothek Javadoc aber ich Ich habe es nicht ganz verstanden und bin mir nicht sicher, ob ich danach suche.Wie durchläuft man eine Baumstruktur, um ein Diagramm zu zeichnen?

public class JGraphAdapterDemo 
extends JApplet{ 

private static final long serialVersionUID = 3256444702936019250L; 
private static final Color DEFAULT_BG_COLOR = Color.decode("#FAFBFF"); 
private static final Dimension DEFAULT_SIZE = new Dimension(530, 320); 


private JGraphModelAdapter<String, DefaultEdge> jgAdapter; 

/** 
* An alternative starting point for this demo, to also allow running this applet as an 
* application. 
* 
* @param args ignored. 
*/ 
public static void main(String[] args) 
{ 
    JGraphAdapterDemo applet = new JGraphAdapterDemo(); 
    applet.init(); 

    JFrame frame = new JFrame(); 
    frame.getContentPane().add(applet); 
    frame.setTitle("JGraphT Adapter to JGraph Demo"); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.pack(); 
    frame.setVisible(true); 
} 


    {@inheritDoc} 

public void init() 
{ 

    ListenableGraph<String, DefaultEdge> g = 
     new ListenableDirectedMultigraph<>(DefaultEdge.class); 

    // create a visualization using JGraph, via an adapter 
    jgAdapter = new JGraphModelAdapter<>(g); 

    JGraph jgraph = new JGraph(jgAdapter); 

    adjustDisplaySettings(jgraph); 
    getContentPane().add(jgraph); 
    resize(DEFAULT_SIZE); 

    String v1 = "+"; 
    String v2 = "3"; 
    String v3 = "*"; 
    String v4 = "4"; 
    String v5 = "5"; 

    // add some sample data (graph manipulated via JGraphT) 
    g.addVertex(v1); 
    g.addVertex(v2); 
    g.addVertex(v3); 
    g.addVertex(v4); 
    g.addVertex(v5); 

    g.addEdge(v1, v2); 
    g.addEdge(v1, v3); 
    g.addEdge(v3, v4); 
    g.addEdge(v3, v5); 

    positionVertexAt(v1, 130, 40); 
    positionVertexAt(v2, 50, 150); 
    positionVertexAt(v3, 280, 150); 
    positionVertexAt(v4, 240, 250); 
    positionVertexAt(v5, 400, 250); 

} 

private void adjustDisplaySettings(JGraph jg) 
{ 
    jg.setPreferredSize(DEFAULT_SIZE); 

    Color c = DEFAULT_BG_COLOR; 
    String colorStr = null; 

    try { 
     colorStr = getParameter("bgcolor"); 
    } catch (Exception e) { 
    } 

    if (colorStr != null) { 
     c = Color.decode(colorStr); 
    } 

    jg.setBackground(c); 
} 

@SuppressWarnings("unchecked") 
private void positionVertexAt(Object vertex, int x, int y) 
{ 
    DefaultGraphCell cell = jgAdapter.getVertexCell(vertex); 
    AttributeMap attr = cell.getAttributes(); 
    Rectangle2D bounds = GraphConstants.getBounds(attr); 

    Rectangle2D newBounds = new Rectangle2D.Double(x, y, bounds.getWidth(), bounds.getHeight()); 

    GraphConstants.setBounds(attr, newBounds); 


    AttributeMap cellAttr = new AttributeMap(); 
    cellAttr.put(cell, attr); 
    jgAdapter.edit(cellAttr, null, null, null); 
} 

private static class ListenableDirectedMultigraph<V, E> 
    extends DefaultListenableGraph<V, E> 
    implements DirectedGraph<V, E> 
{ 
    private static final long serialVersionUID = 1L; 

    ListenableDirectedMultigraph(Class<E> edgeClass) 
    { 
     super(new DirectedMultigraph<>(edgeClass)); 
    } 
}} 

Ich verwende diese Demo-Code aus dem javadoc und ich möchte einen Weg finden, es zu dieser Baumstruktur zu verbinden. Hat jemand so etwas Ähnliches gemacht?

Das ist meine Baumstruktur

public class Tree { 
    Tree left, right; 
char op; 
int val; 
boolean isOp; 

Tree(char op, Tree l, Tree r) { 
this.isOp = true; 
this.left = l; 
this.right = r; 
this.op = op; 
} 

Tree (int v){ 
this.isOp = false; 
this.val = v; 
} 

static void toString(Tree t) { 
if (t.isOp){ 
    toString(t.left); 
    System.out.print(t.op); 
    toString(t.right); 
} 
else 
    System.out.print(t.val); 
} 


public void preorderIter(Tree root) { 

    if(root == null) 
     return; 

    Stack<Tree> stack = new Stack<Tree>(); 
    stack.push(root); 

    while(!stack.empty()){ 

     Tree n = stack.pop(); 
     System.out.printf("%s ",n.op); 


     if(n.right != null){ 
      stack.push(n.right); 
      System.out.printf("%s",n.right); 
     } 
     if(n.left != null){ 
      stack.push(n.left); 
      System.out.printf("%s",n.left); 


     } 

    } 

} 

ich Hilfe

Antwort

0

JGraphT Bibliothek ihrer eigenen Graphenklassen verwendet, zieht schätzen würde, so dass Sie entweder zu müssen:

  • aufgeben Ihre eigenen Baum-Implementierung und Verwendung Bibliotheksklassen
  • erweitern Sie eine geeignete Baumklasse in Bibliothek mit Ihrer eigenen Implementierung
  • Ihren eigenen Baum verwenden, wie Sie möchten, aber wenn man mit jgraph zeichnen müssen, kopieren Sie Ihre Baums Knoten und Kanten eines Graphen Implementierungen des Rahmens
+0

ok lassen Sie uns sagen, ich gebe mein Baum-Bibliothek und ich Werde ich die Bibliotheksklassen verwenden, irgendeine Idee, wie ich einen Baum mit JGraphT-Klassen konstruieren kann? Eine Erklärung wäre in Ordnung. – Dee

+0

Vertex = Baumknoten und Kante = Verbindungen zwischen Baumknoten. Wenn Sie diese kennen, haben Sie bereits den Beispielcode in Ihrem ersten Codeblock, um ein Diagramm oder einen Baum zu erstellen. Tree ist nur eine spezielle Art von Graphen. – Reek

Verwandte Themen