2012-07-09 56 views
3

我正在嘗試使用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同春佈局 Overlapping Verticies with Spring Layout

放大春天佈局似乎更好 Zoom in of Spring Layout appears better

+0

你有沒有找到自己的解決方案?我在解決方案中很有趣,我遇到了同樣的問題。 – Zangdak 2014-04-29 14:53:59

+0

不能在我解決這個問題之前不得不停止在項目上工作。如果您找到解決方案,請在此發佈,因爲我很好奇! – Jim 2014-04-29 18:56:36

回答

2

對於節點間距,有setForceMultiplier和setRepulsionRange將在幫助確定如何天南海北節點被繪製。爲了擺脫「晃動」,做layout.lock(true),以保持節點到位,一旦他們在你想要的地方。