1

助けが必要です。jung でグラフを視覚化しようとしていますが、頂点が動き回り、色がランダムに変化し続けます。私が達成したいのは、特定の色でいくつかの頂点を表示し (色で区別されたクラスターを持つ頂点を持つように)、次に、関心のある 2 つの頂点間のパスを視覚化することです。頂点の数は 500 を超えています。私は jung が初めてで、このタスクを達成するために、このフォーラムのスレッドから取得したコードを変更しようとしました。私が使用しているコードを以下に示します

import edu.uci.ics.jung.algorithms.layout.ISOMLayout;
import edu.uci.ics.jung.algorithms.layout.Layout;
import edu.uci.ics.jung.graph.SparseGraph;
import edu.uci.ics.jung.visualization.RenderContext;
import edu.uci.ics.jung.visualization.VisualizationViewer;
import edu.uci.ics.jung.visualization.control.DefaultModalGraphMouse;
import edu.uci.ics.jung.visualization.control.ModalGraphMouse;
import edu.uci.ics.jung.visualization.renderers.Renderer;
import edu.uci.ics.jung.visualization.transform.shape.GraphicsDecorator;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Shape;
import java.awt.geom.Ellipse2D;
import java.awt.geom.Point2D;
import java.util.Random;
import javax.swing.JFrame;
import org.apache.commons.collections15.Transformer;

public class graphMainHelp {

public static void main(String[] args) {

    SparseGraph graph = new SparseGraph();
    String[] vertices = {"A", "B", "C", "D", "E", "F", "G", "H", "I", "J"};

    for (int i = 0; i < vertices.length; i++) {
        graph.addVertex((String) vertices[i]);
    }

    graph.addEdge(1, "J", "A");
    graph.addEdge(2, "A", "C");
    graph.addEdge(3, "B", "A");
    graph.addEdge(4, "B", "J");
    graph.addEdge(5, "I", "E");
    graph.addEdge(6, "B", "F");
    graph.addEdge(7, "C", "A");
    graph.addEdge(8, "G", "E");
    graph.addEdge(9, "G", "F");
    graph.addEdge(10, "H", "B");
    graph.addEdge(11, "G", "C");
    graph.addEdge(12, "E", "G");
    graph.addEdge(13, "I", "B");
    graph.addEdge(14, "F", "J");
    graph.addEdge(15, "F", "E");


    if (graph.getVertexCount() != 0 || graph.getEdgeCount() != 0) {
        Layout<String, String> layout = new ISOMLayout<String, String>(graph);
        layout.setSize(new Dimension(700, 700));

        VisualizationViewer<String, String> vv = new VisualizationViewer<String, String>(layout);



        vv.getRenderContext().setVertexLabelTransformer(new Transformer<String, String>() {

            @Override
            public String transform(String arg0) {
                return arg0;
            }
        });

        vv.getRenderer().setVertexRenderer(new MyRenderer());


         final DefaultModalGraphMouse<String, Number> graphMouse = new
         DefaultModalGraphMouse<String, Number>();
         graphMouse.setMode(ModalGraphMouse.Mode.PICKING);
         vv.setGraphMouse(graphMouse);


        JFrame frame = new JFrame();
        frame.getContentPane().add(vv);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setVisible(true);
    }// close main method    


}

static class MyRenderer implements Renderer.Vertex<String, String> {

    @Override
    public void paintVertex(RenderContext<String, String> rc, Layout<String, String> layout, String vertex) {
        GraphicsDecorator graphicsContext = rc.getGraphicsContext();
        Point2D center = layout.transform(vertex);

        Shape shape = null;
        Color color = null;

        shape = new Ellipse2D.Double(center.getX() - 10, center.getY() - 10, 20, 20);
        Random random = new Random();
        int r = random.nextInt(256);  
        int g = random.nextInt(200);
        int b = random.nextInt(250);

        color = new Color(r, g, b);
        graphicsContext.setPaint(color);
        graphicsContext.fill(shape);

    }
}//close static class

}

4

1 に答える 1

1

頂点の色が変わっているのは、頂点をレンダリングするたびに新しいランダムな色を与えてペイントするように指示したためです。カスタムレンダラーを使用している理由がまったくわかりません。デフォルト以外の形状や色を指定する場合は、PlugableRendererContextと関連するデモを参照してください。

JUNG ダウンロード自体には多数のデモがあります。StackOverflow のサンプルから始めるのではなく、それらを参照することをお勧めします。

于 2013-11-06T18:12:01.587 に答える