JUNG: Изменение цвета вершины

Я использовал библиотеку JUNG для визуализации одной сети, состоящей из серверов и ссылок через граф.

Итак, я инициализирую свой график следующим образом: сервер и ссылка — это классы в моем проекте:

            Graph<Server, Link> g;

    g = new SparseMultigraph<Server, Link>();

Теперь мне нужно изменить цвет определенных вершин... поэтому я использовал код ниже:

// Настраиваем новую вершину для рисования трансформатора

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

    vv.getRenderContext().setVertexFillPaintTransformer(vertexPaint);

Я получил исключение java.lang.ClassCastException следующим образом!

  Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: network.Server cannot be cast to java.lang.Integer
at GUI.GUI$9.transform(GUI.java:1)
at edu.uci.ics.jung.visualization.renderers.BasicVertexRenderer.paintShapeForVertex(BasicVertexRenderer.java:98)
at edu.uci.ics.jung.visualization.renderers.BasicVertexRenderer.paintIconForVertex(BasicVertexRenderer.java:74)
at edu.uci.ics.jung.visualization.renderers.BasicVertexRenderer.paintVertex(BasicVertexRenderer.java:37)
at edu.uci.ics.jung.visualization.renderers.BasicRenderer.renderVertex(BasicRenderer.java:70)
at edu.uci.ics.jung.visualization.renderers.BasicRenderer.render(BasicRenderer.java:55)
at edu.uci.ics.jung.visualization.BasicVisualizationServer.renderGraph(BasicVisualizationServer.java:367)
at edu.uci.ics.jung.visualization.BasicVisualizationServer.paintComponent(BasicVisualizationServer.java:321)
at javax.swing.JComponent.paint(Unknown Source)

Мой полный код для обновления графика находится здесь:

частный статический BasicVisualizationServer updateGraph (сетевая сеть) {

            Set<Server> servers = network.getServers();
    Set<Link> links = network.getLinks();
            Graph<Server, Link> g;
    // Graph<V, E> where V is the type of the vertices and E is the type of
    // the edges
    g = new SparseMultigraph<Server, Link>();
    // Add some vertices and edges
    for (Server server : servers) {
        g.addVertex(server);
    }

    int i = 0;
    for (Link link : links) {
        g.addEdge(link, link.getSource(), link.getDest(), EdgeType.DIRECTED);
        i++;
    }


    // Layout<V, E>, VisualizationViewer<V,E>
    Layout<Integer, String> layout = new CircleLayout(g);
    layout.setSize(new Dimension(300, 300));
    VisualizationViewer<Integer, String> vv = new VisualizationViewer<Integer, String>(
            layout);
    vv.setPreferredSize(new Dimension(350, 350));
    // Show vertex and edge labels
    vv.getRenderContext().setVertexLabelTransformer(new ToStringLabeller());
    vv.getRenderContext().setEdgeLabelTransformer(new ToStringLabeller());

     // Setup up a new vertex to paint transformer...
    Transformer<Integer,Paint> vertexPaint = new Transformer<Integer,Paint>() {
        public Paint transform(Integer i) {
            return Color.GREEN;
        }
    };

    vv.getRenderContext().setVertexFillPaintTransformer(vertexPaint);

    // Create a graph mouse and add it to the visualization component
    DefaultModalGraphMouse gm = new DefaultModalGraphMouse();
    gm.setMode(ModalGraphMouse.Mode.TRANSFORMING);
    vv.setGraphMouse(gm);


    rightPanel.setTopComponent(vv);

    //Detecting selection of vertices
    final PickedState<Integer> pickedState = vv.getPickedVertexState();

    // Attach the listener that will print when the vertices selection changes.
    pickedState.addItemListener(new ItemListener() {

        @Override
        public void itemStateChanged(ItemEvent e) {
        Object subject = e.getItem();
            // The graph uses Integers for vertices.
            if (subject instanceof Integer) {
                Integer vertex = (Integer) subject;
                if (pickedState.isPicked(vertex)) {
                    System.out.println("Vertex " + vertex
                        + " is now selected");
                } else {
                    System.out.println("Vertex " + vertex
                        + " no longer selected");
                }
            }
        }
    });

    return vv;
}

person Orcl User    schedule 19.09.2013    source источник
comment
Какая версия? Ссылка на библиотеку? Я не вижу Transformer или Paint в текущих JUNG Javadocs.   -  person chrylis -cautiouslyoptimistic-    schedule 19.09.2013
comment
JUNG 2.0.1 JUNG 2 зависит от трех других библиотек: JUnit, Colt и Common Collections. 1. JUnit: junit.sourceforge.net 2. Коллекции Commons: происходят из коллекций Apache Jakarta Commons jakarta.apache.org/commons/collections sourceforge.net/projects/collections 3. Colt: dsd.lbl.gov/~hoschek/colt   -  person Orcl User    schedule 19.09.2013
comment
Полное имя класса для Transformer и Paint? Кроме того, пожалуйста, опубликуйте всю трассировку стека, а не только то, что вы получаете ClassCastException.   -  person chrylis -cautiouslyoptimistic-    schedule 19.09.2013
comment
импортировать org.apache.commons.collections15.Transformer;   -  person Orcl User    schedule 19.09.2013
comment
импортировать java.awt.Paint; Хорошо... я опубликую полное исключение ошибки   -  person Orcl User    schedule 19.09.2013


Ответы (1)


Ваш тип вершины графа — Server, но ваш Transformer ожидает Integer в качестве входных данных. Вам нужно изменить свой код, чтобы они совпадали.

person chrylis -cautiouslyoptimistic-    schedule 19.09.2013
comment
Спасибо. Я знаю это... но мне нужно, чтобы тип вершины был сервером, а не целым числом... так как это работает, когда я хочу показать график, но возникает проблема, когда я хочу изменить цвет вершины! - person Orcl User; 19.09.2013
comment
Я не говорил, что вам нужно изменить тип вершины. Почему ваш Transformer объявлен <Integer,Paint> вместо <Server,Paint>? - person chrylis -cautiouslyoptimistic-; 19.09.2013
comment
Я не могу это изменить, потому что setVertexFillPaintTransformer требует Transformer‹Integer, Paint› в качестве входных данных!! - person Orcl User; 19.09.2013
comment
Почему вы объявляете VisualizationViewer как <Integer,String>, если ваш график <Server,Link>? Вы копировали и вставляли большие блоки кода без последовательных изменений? - person chrylis -cautiouslyoptimistic-; 19.09.2013
comment
Спасибо. На самом деле это были сначала Integer и String, вы правы. Я изменил их все, и теперь это работает! - person Orcl User; 19.09.2013
comment
@OrclUser Пожалуйста, не забудьте проголосовать и принять полезные ответы! - person chrylis -cautiouslyoptimistic-; 19.09.2013