2013-08-20 38 views
-2

我使用JUNG java库管理图表,并且想知道如何使用相同颜色对连接的节点着色以区分连接的组件。使用库JUNG图表

例如,我想的节点234到具有相同的颜色和节点1具有另一种颜色,知道邻接矩阵是:

0 0 0 0 
0 0 1 1 
0 1 0 1 
0 1 1 0 

代码来创建图表(节点具有相同的颜色):

Graph<Integer, String> g; 
/** Creates a new instance of SimpleGraphView */ 
public ReadFile(int nbsommet,int [] [] nodeMat) { 
    // Graph<V, E> where V is the type of the vertices and E is the type of the edges 
    // Note showing the use of a SparseGraph rather than a SparseMultigraph 
    g = new SparseGraph<Integer, String>(); 
    // Add some vertices. From above we defined these to be type Integer. 
    /*for (int i = 1; i <=nbsommet; i++) { 
     g.addVertex((Integer)i); 

    }*/ 
     for (int i = 1; i <=nbsommet; i++) 
     { g.addVertex((Integer)i); 
      for (int j = 1; j<=nbsommet; j++) 
      { 
       if((nodeMat[i][j]==1)&& (j>i)) 
       { if(!(g.getVertices().contains(j))) 
       { g.addVertex((Integer)j);} 
        g.addEdge(i+" "+j, i, j); 
        } 

    }}} 
//... 
    ReadFile sgv = new ReadFile(nbsommet,nodeMatfinal); // This builds the graph 
    //Design sgv1 = new Design(); 
    Layout<Integer, String> layout = new KKLayout (sgv.g); 
    //TreeLayout layout = new TreeLayout(sgv.g,100,100); 
    layout.setSize(new Dimension(800,800)); 
    BasicVisualizationServer<Integer, String> vv = new BasicVisualizationServer<Integer, String>(layout); 

    Transformer<Integer,Paint> vertexPaint = new Transformer<Integer,Paint>() { 
     public Paint transform(Integer i) { 
      return (Paint) Color.GREEN; 
     } 
    }; 

    vv.setPreferredSize(new Dimension(850,850)); 
    vv.getRenderContext().setVertexLabelRenderer(new  DefaultVertexLabelRenderer(Color.green)); 
    vv.getRenderContext().setEdgeDrawPaintTransformer(new ConstantTransformer(Color.white)); 
    vv.getRenderContext().setEdgeStrokeTransformer(new ConstantTransformer(new BasicStroke(2.5f))); 

    vv.getRenderContext().setVertexFillPaintTransformer((Transformer<Integer, java.awt.Paint>) vertexPaint); 
    vv.getRenderContext().setVertexFillPaintTransformer(new PickableVertexPaintTransformer<Integer>(vv.getPickedVertexState(), Color.green, Color.yellow)); 

    vv.setBackground(Color.gray); 
    vv.getRenderContext().setVertexLabelTransformer(new ToStringLabeller<Integer>()); 
    vv.getRenderer().getVertexLabelRenderer().setPosition(Position.CNTR); 


    JFrame frame = new JFrame("Graph"); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.getContentPane().add(vv); 
    frame.pack(); 
    frame.setVisible(true); 

那么如何改变这种代码有连接部件用不同的颜色

+0

@Tichodroma现在OP不理解他/她自己的问题,谢谢你的无效编辑。 –

+0

@RomanC如果您查看[revisions](http://stackoverflow.com/posts/18331566/revisions),您会看到我重新添加了一个被http:// stackoverflow删除的编辑。 com/users/2345880/vaibhav-jain翻译了旧版本的问题。但请继续并回滚所有修改。 – 2013-08-20 09:42:03

+0

@ user2699285使用JUNG有问题吗?你试过什么了?请包含您的代码。 – 2013-08-20 09:46:48

回答

1

JUNG库不允许您为每个顶点设置不同的渲染器,因此您可以使用一个渲染器并在其中放置一些逻辑。 (我从this SO post得到了这个想法)。

您现在必须确定哪些顶点应该获得哪些颜色,并将其放入方法调用或Map<Integer, Color>。我将承担后者:

final Map<Integer,Color> colorMapping = new HashMap<Integer, Color>(); 

// ..... 

Transformer<Integer,Paint> vertexPaint = new Transformer<Integer,Paint>() 
{ 
    public Paint transform(Integer i) 
    { 
     return colorMapping.get(i.intValue()); 
    } 
}; 

显然,这留下的问题是如何填补colorMapping
您需要确定哪些是来自邻接矩阵的连接组件;这是一个单独的问题,已在this StackOverflow post中处理。
一旦你有单独的子图,所有剩下要做的就是给它们分配颜色,并相应地填写colorMapping


对您的代码示例的几个注意事项:

  1. 我不得不评论这个调用:

    vv.getRenderContext().setVertexFillPaintTransformer(new PickableVertexPaintTransformer<Integer>(vv.getPickedVertexState(), Color.green, Color.yellow));

    它设置一个新的PaintTransformer替换调用一个vertexPaint

  2. 您的图初始化是基于1的,但该数组是基于0的。你应该改变

    if((nodeMat[i][j]==1)&& (j>i))

    if((nodeMat[i-1][j-1]==1)&& (j>i))

    ,或者你会得到一个ArrayIndexOutOfBoundsException。

+0

我会尝试这个想法。感谢您的帮助。 – user2699285