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


         }  

     }  

 }  

我将不胜感激任何帮助

4

1 回答 1

0

JGraphT 库使用自己的图形类进行绘制,因此您需要:

  • 放弃自己的树实现并使用库的类
  • 使用您自己的实现在库中扩展适当的树类
  • 随意使用自己的树,但是当您需要使用 jgraph 进行绘制时,请将树的节点和边复制到框架的图形实现之一
于 2016-12-10T21:06:11.943 回答