我正在嘗試使用Jung作爲項目並獲得外觀/行爲我希望我從一些測試數據開始。Jung,大頂點重疊的佈局和圖形出現在奇怪的位置
這個想法是在Verticies形狀上有標籤的非常大的頂點。圖形的數據將在運行時生成,所以我不能做靜態佈局。
如何佈局圖形,使頂點不重疊,但仍足夠大,以便標籤可以放在裏面(真正的標籤將有更長的字符串20-30個字符)。我曾嘗試使用SpringLayout,但節點仍然重疊,此外佈局保持搖擺(這是令人討厭的)。
我也嘗試了FRLayout,同時增加了斥力乘數,但是在數量變得足夠大之後,它只會創建一個頂點重疊的圓。
如果我放大使用鼠標手勢節點似乎分開,我得到一個更接近我想要的視圖。因此,也許解決方案涉及到初始化放大,只是不確定如何做到這一點,以及如何決定放大多少,因爲它可能取決於節點數量。
一般來說,我的數據將有少量的節點(小於50,通常小於10)。然而,它是數據驅動的,所以我沒有完全控制這些大小。
最後,當圖形顯示出來時,它也部分偏離了屏幕。理想情況下,它會渲染可視區域的左上部分。有沒有辦法控制它?
下面是我正在使用的示例類,以更好地展示我的意思(修剪發佈)。
import edu.uci.ics.jung.graph.Graph;
import edu.uci.ics.jung.graph.util.TestGraphs;
import edu.uci.ics.jung.visualization.VisualizationViewer;
import edu.uci.ics.jung.algorithms.layout.AbstractLayout;
import edu.uci.ics.jung.algorithms.layout.SpringLayout;
import edu.uci.ics.jung.visualization.GraphZoomScrollPane;
import edu.uci.ics.jung.visualization.control.DefaultModalGraphMouse;
import edu.uci.ics.jung.visualization.control.ModalGraphMouse;
import edu.uci.ics.jung.visualization.decorators.AbstractVertexShapeTransformer;
import edu.uci.ics.jung.visualization.decorators.EdgeShape;
import edu.uci.ics.jung.visualization.decorators.ToStringLabeller;
import java.awt.BorderLayout;
import java.awt.Color;
import org.apache.commons.collections15.Transformer;
import org.apache.commons.collections15.functors.ConstantTransformer;
import edu.uci.ics.jung.visualization.picking.PickedState;
import edu.uci.ics.jung.visualization.renderers.DefaultVertexLabelRenderer;
import edu.uci.ics.jung.visualization.renderers.GradientVertexRenderer;
import edu.uci.ics.jung.visualization.renderers.VertexLabelAsShapeRenderer;
import java.awt.*;
public class IDRelationshipGraphPanel extends javax.swing.JPanel
{
private final VisualizationViewer<Integer,Number> vv;
protected Transformer<Integer,String> vs;
protected DefaultModalGraphMouse<Integer, Number> gm;
protected AbstractLayout layout;
protected VertexShapeSizeAspect<Integer,Number> vssa;
public IDRelationshipGraphPanel()
{
Graph<? extends Object, ? extends Object> g = TestGraphs.getOneComponentGraph();
layout = new SpringLayout(g) ;
vv= new VisualizationViewer<Integer,Number>(layout);
GraphZoomScrollPane scrollPane = new GraphZoomScrollPane(vv);
gm = new DefaultModalGraphMouse<Integer, Number>();
vv.setGraphMouse(gm);
add(scrollPane, BorderLayout.CENTER);
PickedState<Integer> picked_state = vv.getPickedVertexState();
VertexLabelAsShapeRenderer<Integer, Number> vlasr = new VertexLabelAsShapeRenderer<Integer, Number>(vv.getRenderContext());
vv.getRenderContext().setVertexShapeTransformer(vlasr);
vv.getRenderContext().setVertexLabelRenderer(new DefaultVertexLabelRenderer(Color.red));
vv.getRenderContext().setEdgeStrokeTransformer(new ConstantTransformer(new BasicStroke(2.5f)));
// customize the renderer
vv.getRenderer().setVertexRenderer(new GradientVertexRenderer<Integer, Number>(new Color(175,224,228), new Color(133,170,173), true));
vv.getRenderer().setVertexLabelRenderer(vlasr);
vv.getRenderContext().setVertexLabelTransformer(new ToStringLabeller<Integer>());
vv.getRenderContext().setEdgeShapeTransformer(new EdgeShape.Line<Integer, Number>());
vssa = new VertexShapeSizeAspect<Integer,Number>();
vv.getRenderContext().setVertexShapeTransformer(vssa);
vv.getRenderContext().setArrowFillPaintTransformer(new ConstantTransformer(Color.lightGray));
vv.getRenderContext().setArrowDrawPaintTransformer(new ConstantTransformer(Color.black));
}
private final static class VertexShapeSizeAspect<V,E>
extends AbstractVertexShapeTransformer <V>
implements Transformer<V,Shape> {
public VertexShapeSizeAspect()
{
setSizeTransformer(new Transformer<V,Integer>()
{
public Integer transform(V v)
{
return 150;
}
});
setAspectRatioTransformer(new Transformer<V,Float>()
{
public Float transform(V v)
{
return 1.0f;
}
});
}
public Shape transform(V v){return factory.getEllipse(v);}
}
}
重疊Verticies同春佈局
放大春天佈局似乎更好
你有沒有找到自己的解決方案?我在解決方案中很有趣,我遇到了同樣的問題。 – Zangdak 2014-04-29 14:53:59
不能在我解決這個問題之前不得不停止在項目上工作。如果您找到解決方案,請在此發佈,因爲我很好奇! – Jim 2014-04-29 18:56:36