2016-12-10 67 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的演示代码,我想找到一种方法将它连接到这个树结构。有没有人做过类似的事情?

这是我的树结构

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


     } 

    } 

} 

我希望得到任何帮助

回答

0

JGraphT库使用自己的图形类绘制,所以你要么需要:

  • 放弃您自己的树实现并使用库的类
  • 使用您自己的实现在库中扩展适当的树类
  • 使用自己的树,只要你喜欢,但是当你需要jgraph画画,你的树的节点和边复制到框架的图实现的一个
+0

OK让我们说我放弃了我的树库和我要去使用库类,有关如何使用JGraphT类构建树的任何想法?解释会很好。 – Dee

+0

顶点=树节点和边=树节点之间的连接。知道了这些,您已经在第一个代码块中获得了如何创建图或树的示例代码。树只是一种特殊的图形。 – Reek