0
我被困在可視化部分,我創建了一個DirectedSparseMultiGraph,用於可視化以下轉換圖。我想以與image.中描述的相同的方式繪製它現在我得到this.如何在JUNG(Java通用網絡/圖形框架)中可視化狀態轉換圖?
我知道問題在於佈局,但我是JUNG框架的新手,我無法獲得它對。
這裏是我的代碼片斷:
MyVertex和MyEdge類是簡單的類爲他們的ID的字段和邊緣的相關聯的概率。
package testing.jung.in.eclipse;
import java.awt.Dimension;
import javax.swing.JFrame;
import edu.uci.ics.jung.algorithms.layout.CircleLayout;
import edu.uci.ics.jung.algorithms.layout.Layout;
import edu.uci.ics.jung.graph.DirectedSparseMultigraph;
import edu.uci.ics.jung.graph.Graph;
import edu.uci.ics.jung.graph.util.EdgeType;
import edu.uci.ics.jung.visualization.BasicVisualizationServer;
import edu.uci.ics.jung.visualization.decorators.ToStringLabeller;
import edu.uci.ics.jung.visualization.renderers.Renderer.VertexLabel.Position;
public class BasicGraphCreation
{
public static void main(String[] args)
{
Graph<MyVertex, MyEdge> g = new DirectedSparseMultigraph<MyVertex, MyEdge>();
MyVertex n0 = new MyVertex(0);
MyVertex n1 = new MyVertex(1);
MyVertex n2 = new MyVertex(2);
MyVertex n3 = new MyVertex(3);
MyVertex n4 = new MyVertex(4);
MyVertex n5 = new MyVertex(5);
MyVertex n6 = new MyVertex(6);
MyVertex o1 = new MyVertex(001);
MyVertex o2 = new MyVertex(010);
MyVertex o3 = new MyVertex(011);
MyVertex o4 = new MyVertex(100);
MyVertex o5 = new MyVertex(101);
MyVertex o6 = new MyVertex(110);
g.addEdge(new MyEdge(0.5), n0, n1, EdgeType.DIRECTED);
g.addEdge(new MyEdge(0.5), n1, n3, EdgeType.DIRECTED);
g.addEdge(new MyEdge(0.5), n3, n1, EdgeType.DIRECTED);
g.addEdge(new MyEdge(0.5), n1, n4, EdgeType.DIRECTED);
g.addEdge(new MyEdge(0.5), n3, o1);
g.addEdge(new MyEdge(0.5), n4, o2);
g.addEdge(new MyEdge(0.5), n4, o3);
g.addEdge(new MyEdge(0.5), n0, n2);
g.addEdge(new MyEdge(0.5), n2, n5);
g.addEdge(new MyEdge(0.5), n2, n6);
g.addEdge(new MyEdge(0.5), n6, n2);
g.addEdge(new MyEdge(0.5), n5, o4);
g.addEdge(new MyEdge(0.5), n5, o5);
g.addEdge(new MyEdge(0.5), n6, o6);
Layout<MyVertex, MyEdge> layout = new CircleLayout<MyVertex, MyEdge>(g);
layout.setSize(new Dimension(600, 600)); // sets the initial size of the space
// The BasicVisualizationServer<V,E> is parameterised by the edge types
BasicVisualizationServer<MyVertex, MyEdge> vv = new BasicVisualizationServer<MyVertex, MyEdge>(layout);
vv.setPreferredSize(new Dimension(650, 650)); //Sets the viewing area size
vv.getRenderContext().setVertexLabelTransformer(new ToStringLabeller<MyVertex>());
vv.getRenderContext().setEdgeLabelTransformer(new ToStringLabeller<MyEdge>());
vv.getRenderer().getVertexLabelRenderer().setPosition(Position.CNTR);
JFrame frame = new JFrame("Directed Graph ");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(vv);
frame.pack();
frame.setVisible(true);
}
}
感謝Joshua的回覆,上面顯示的例子僅供參考,但我所擁有的是可能會改變的頂點,邊緣和標籤信息,然後我必須創建一個如上所述的狀態機,所以StaticLayout將不會完成這項工作,是由我自己創建一個算法只有有效的選項。 你可以建議我一些其他的開源選項,用於Java中的有限狀態機的可視化,我想在另一個項目中使用它,我發現http://jautomata.sourceforge.net/但自2006年以來它的開發停滯不前。 – longjohnsilver
您是否在創建JUNG2佈局時遇到過這個問題? – longjohnsilver
如果您的圖形是一棵樹或基本上像樹(如您的示例),則可以使用TreeLayout。可能有一些像樣的現有算法用於渲染FSM--這不是我研究過的 - 如果有的話,你可以在JUNG中實現它們,而不必開發自己的算法。對於它的價值,JUNG佈局算法試圖針對一般圖形進行優化,而不是試圖看起來像特定的東西;他們強調武力導向的佈局。 CircleLayout很少是正確的答案。嘗試查看ShowLayouts演示以使用不同的選項。 –