2012-07-09 32 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),以保持节点到位,一旦他们在你想要的地方。