2016-12-10 6 views
0

私はツリー構造のグラフを描画するためにJGraphTライブラリを使っていますが、ライブラリは与えられたノードと接続されたエッジに基づいてグラフを描画します。ライブラリ "javadoc"のクラス "DirectedAcyclicGraph.VisitedArrayListImpl"それをかなり理解していないし、私はそれが私が探しているものかどうか分からない。グラフを描くためにツリー構造をトラバースする方法は?

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)); 
    } 
}} 

私はこのデモコードをjavadocから使用しています。このツリー構造に接続する方法を探したいと思います。誰もこれに似た何かをしたことがありますか?

これは私があなたに必要なのいずれかのよう

答えて

0

JGraphTライブラリは、描画する独自のグラフクラスを使用している任意の助けいただければ幸い私のツリー構造

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); 


     } 

    } 

} 

です:あきらめ

  • を独自のツリー実装とライブラリのクラスを使用
  • 独自の実装でライブラリ内の適切なツリークラスを拡張する
  • は、あなたが好きなようにあなた自身のツリーを使用していますがJGraphはして描画する必要があるときに、フレームワークのグラフの実装の1つに、ツリーのノードとエッジをコピー
+0

OKのは、私は私の木のライブラリをあきらめていると私は」としましょう私はJGraphTクラスを使ってツリーをどのように構築することができるか考えていますか?説明はうまくいくはずです。 – Dee

+0

頂点=ツリーノードとエッジ=ツリーノード間の接続。最初のコードブロックにグラフやツリーの作成方法のサンプルコードがあります。ツリーは単なるグラフのようなものです。 – Reek

関連する問題