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);
}
}
}
我希望得到任何帮助
OK让我们说我放弃了我的树库和我要去使用库类,有关如何使用JGraphT类构建树的任何想法?解释会很好。 – Dee
顶点=树节点和边=树节点之间的连接。知道了这些,您已经在第一个代码块中获得了如何创建图或树的示例代码。树只是一种特殊的图形。 – Reek