2016-12-10 34 views
0

Я работаю с библиотекой JGraphT, чтобы нарисовать график для моей древовидной структуры, но библиотека рисует график на основе заданного набора узлов и связанных ребер. Я прочитал класс «DirectedAcyclicGraph.VisitedArrayListImpl» в библиотеке javadoc, но я не совсем понял, и я не уверен, что это то, что я ищу.Как пересечь древовидную структуру, чтобы нарисовать график?

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

ок давайте говорить, что я бросаю свою библиотеку дерева и я m собирается использовать классы библиотеки, любую идею о том, как я могу построить дерево с использованием классов JGraphT? объяснение будет прекрасным. – Dee

+0

vertex = tree node и edge = соединения между узлами дерева. Зная это, у вас уже есть образец кода в вашем первом блоке кода о том, как создать граф или дерево. Дерево - это всего лишь особый вид графика. – Reek

 Смежные вопросы

  • Нет связанных вопросов^_^