java layout graph-theory prefuse

java - Prefuse Toolkit: añadiendo dinámicamente nodos y bordes



layout graph-theory (4)

Necesitas decirle al contenedor de control (''d'', en example.java) ser redibujado. Llamar a invalidate () debería ser suficiente (aunque no estoy seguro).

De todos modos, esto podría ayudarte.

¿Alguien tiene experiencia con el juego de herramientas de gráfico de prefijos? ¿Es posible cambiar un gráfico ya mostrado, es decir. agregar / eliminar nodos y / o bordes, y hacer que la pantalla se adapte correctamente?

Por ejemplo, prefuse viene con un ejemplo que visualiza una red de amigos:

http://prefuse.org/doc/manual/introduction/example/Example.java

Lo que me gustaría hacer es algo parecido a esto:

// -- 7. add new nodes on the fly ------------------------------------- new Timer(2000, new ActionListener() { private Node oldNode = graph.nodes().next(); // init with random node public void actionPerformed(ActionEvent e) { // insert new node // Node newNode = graph.addNode(); // insert new edge // graph.addEdge(oldNode, newNode); // remember node for next call // oldNode = newNode; } }).start();

Pero parece que no funciona. ¿Algún consejo?


Debe tener en cuenta las varias capas de prefuse:

  • Datos
  • Visualización
  • Monitor

Para ser breve, las tres capas se pueden vincular de esta manera:

Graph graph = new Graph(eg. yourXML_file); Visualization viz = new Visualization(); viz.add(GRAPH, graph); Display disp = new Display(); disp.setVisualization(viz);

La pantalla es un componente gráfico que agrega a un panel como de costumbre.

Aquí solo modificas la capa de datos.

Node newNode = graph.addNode(); graph.addEdge(oldNode, newNode);

Ahora necesita actualizar la capa visual:

viz.run("repaint");

La acción de repintado debe definirse.

ActionList repaint = new ActionList(); repaint.add(new RepaintAction()); viz.putAction("repaint", repaint);

Realmente te aconsejo que leas el documento de prefuse . Y puedes encontrar muchos recursos en el foro oficial

Al menos, puedo decir que ese prefuse por el momento no es realmente eficiente para la actualización de gráficos en vivo.

Pero no debería ser suficiente, ya que modificó la estructura del gráfico, tiene que regenerarlo en la visualización (es decir, volver a calcular las ubicaciones de los nodos, etc.). Hay dos acciones ya definidas en su código de muestra. Ejecútelos al final de su acción Performado.

viz.run("color"); viz.run("layout");

Este método no es muy eficiente, ya que agrega una gran cantidad de cálculos cada vez que agrega un nodo, pero no hay otros por el momento con el prefijo.


Como señalé en mi otra publicación, la razón por la cual los nuevos nodos y bordes no son visibles en el ejemplo original es que los colores, etc. para los nodos no están configurados correctamente. Una forma de solucionar esto es llamar explícitamente a vis.run ("color"); cada vez que se agrega un nodo o borde.

De forma alternativa, podemos asegurarnos de que la acción de color siempre se esté ejecutando, inicializando la Lista de Acciones a la que la agregamos (llamada "color" en el ejemplo original) de forma ligeramente diferente:

en lugar de

ActionList color = new ActionList();

podríamos escribir

ActionList color = new ActionList(Activity.INFINITY);

Esto mantiene la lista de acciones ejecutándose indefinidamente, de modo que los nuevos nodos / bordes se inicialicen automáticamente para su apariencia visual.

Sin embargo, no está claro si este sería realmente el método preferido; para cosas como una acción de diseño dinámico (por ejemplo, ForceDirectedLayout), tal declaración tiene mucho sentido, pero para los colores me parece que una acción de coloración que se ejecuta constantemente es en su mayoría gastos generales.

Entonces, tal vez la solución publicada anteriormente de solo ejecutar la acción de "color" explícitamente (pero solo una vez) siempre que se extienda el gráfico, sea la mejor opción ...


De acuerdo, después de investigar un poco sobre las fuentes de prefusión, ahora entiendo mejor cómo funcionan las cosas bajo el capó. Descubrí que, en realidad, los nuevos nodos que creo con el código anterior no solo se agregan correctamente al gráfico, ¡la visualización también lo nota!

Por lo tanto, a diferencia de lo que sugiere Jerome, no es necesario llamar a vis.run ("diseño") explícitamente.

La razón por la que pensé que los nodos no se agregaron correctamente fue el hecho de que se dibujaron con fondo blanco, borde y color de texto , sobre fondo blanco. No es sorprendente que sean un poco difíciles de detectar.

Para solucionarlo, debe llamar a la acción de color después de insertar un nuevo nodo, como este:

// insert new edge // graph.addEdge(oldNode, newNode); vis.run("color"); // <- this is new

(Tenga en cuenta que esta acción se define más arriba en el código de Example.jar en // - 4.)

Una última cosa de la que no estoy seguro ahora es si al invocar esta acción, el prefuse volverá a pasar por todos los nodos gráficos y establecerá su color, para gráficos muy grandes que, por supuesto, no serían deseados.