comparando código abierto marcos de dibujo gráfico java (Jung y Prefuse) para la elaboración de topología de la red

StackOverflow https://stackoverflow.com/questions/4670846

Pregunta

que de la fuente de Java gráfico abierto dibujo marcos a utilizar para un diagrama de red con los siguientes requisitos? El gráfico tendrá menos de 1000 nodos.

1) tiene bordes paralelos
2) dirigida y no dirigida bordes dentro de un solo gráfico
3) los nodos representados por imágenes
4) la interacción del usuario con nodos y los bordes
5) añadir dinámicamente / nodos y los bordes eliminar
6) etiquetado múltiple en los nodos y los bordes, diferentes niveles de etiquetado se pueden activar / desactivar por los usuarios. (Como el dibujo en capas y apagar / en una capa)
7) diferentes algoritmos de diseño a estrella pantalla, anillo, malla de topologías

He evaluado Jung y Prefuse. Esto es lo que he encontrado para cada una de mis necesidades.

1) Prefuse no puede mostrar bordes paralelos mientras JUNG lo soporta. Puede ser manipulado prefuse código para mostrar bordes paralelos? Dado que se trata de nivel básico de datos cambia Creo que esto sería más difícil que la de costumbre personalizada haciendo cambios.

2) Me dio encontrar ninguna referencia a gráfico combinado (ambos bordes dirigidos y no dirigidos) tanto en prefuse y JUNG. ¿Alguien sabe de otro modo?

3) Esto parece fácil con tanto Prefuse y Jung

4) Una vez más, tanto prefuse y JUNG proporciona soporte para la interacción del usuario.

5) Tanto prefuse y Jung lo soporta. ¿De qué manera cada marco se realicen durante volver a dibujar el gráfico? Vi en otro post que prefuse no funciona bien para las actualizaciones dinámicas ( Prefuse Toolkit: añadir dinámicamente nodos y bordes )

6) Esto se reduce a la modificación de la gráfica y volver a dibujar ella. Entonces la pregunta es lo mismo que 5)

7) Tanto Jung y prefuse tiene múltiples algoritmos de diseño. Pero cuando traté de mostrar el mismo conjunto de datos utilizando FruchtermanReingoldLayout tanto en Jung y Prefuse consigo diferentes pantallas. Cualquier idea por qué? De alguna manera los algoritmos de diseño en Prefuse parecen mostrar un mejor diseño que en JUNG (representación también es mejor creo) aunque la mayoría de los algoritmos de diseño en Prefuse se basan en la aplicación de JUNG. Prefuse layouts como ForceDirectedLayout / FruchtermanReingoldLayout y CircleLayout asigna directamente a la estrella, círculo, de malla de topologías.

Fuera de estos requisitos, prefuse tiene un buen soporte para expresiones y lenguaje de consulta, pero parece que no se desarrolla de forma activa a diferencia de JUNG. los cuales uno tiene una mejor visualización? Cualquier sugerencia sobre cuál será adecuado y la forma de superar las deficiencias?

Las demás marcos por ahí que puedo usar?

¿Fue útil?

Solución

Hace algunos años (2007?) Yo uso prefuse para visualizar los registros de datos de llamadas. Consideré prefuse, Jung, Jgraph y algunos otros y eligió prefuse. Al principio es un poco difícil de envolver mi cabeza alrededor prefuse pero una vez que familiarizarse con él es muy fácil (extender) y divertido de usar. Supongo que lo mismo puede decirse de JUNG, pero nunca lo probé.

1) En prefuse es muy fácil añadir su intérprete personalizado para la elaboración de bordes paralelos - se puede subclase el EdgeRenderer defecto y reemplazar el método render (). No hay "cambios en el nivel de datos básicos necesarios". Esto es todo en la parte vista, si desea pensar en ella como una materia MVC.

2) Esto no es realmente un problema en absoluto. Hay más de una manera de hacer esto: 1) Puede tener dos procesadores - una para dibujar los bordes dirigidos y uno para dibujar los bordes no dirigidos y van a funcionar bien, y el grupo de los bordes adecuadamente. 2) Poner una bandera (agregar una columna booleana en la tupla mesa de respaldo en hablar prefuse) para indicar si el borde se dirige y pasa la parte de dibujo de flecha en consecuencia en el EdgeRender de acuerdo con esa bandera.

3) Esto es muy fácil

4) ditto

5) La última versión es prefuse "prefuse versión beta 10/21/2007". He utilizado el uno antes de eso, los cuales tienen una posible condición de carrera al añadir o eliminar nodos dinámicamente - que faltaba un par de palabras clave sincronizados, supongo. He resuelto que al asegurarse de que parar toda la animación y las acciones (color, tamaño, diseño) al agregar o quitar nodos - también no se olvide de actualizar sus índices de Lucene también (si usted hace uso de su base de motor de búsqueda Lucene ). El último de ellos se supone que resolver este problema de la raza, pero nunca he tenido la oportunidad de probarlo.

6) Ya que menciona "etiquetado múltiple" Creo que esto no es una cuestión de "modificar el gráfico y vuelve a dibujar," - es sólo una cuestión de personalizar sus etiquetas de extracción de grasas / EDGE para dibujar sólo las etiquetas pertinentes para que esto no es realmente un gran problema. Además no creo que esto está relacionado con 5 en absoluto.

7) No me sorprende que prefuse y la representación de la FruchtermanReingoldLayout de Jung son diferentes - hay algunos factores que podrían afectar a esta uno de ellos el nodo de inicio, donde cada implementación se inicia el cálculo para no preocuparse mucho acerca este problema. Es bastante fácil de probar los diferentes algoritmos de diseño gráfico incorporado en prefuse para que pueda seguir adelante y echa un vistazo a lo que uno está más cerca de lo que le gustaría tener. Echa un vistazo a la RadialLayout y BalloonTreeLayout para el diseño de la estrella. ForceDirectedLayout necesita un buen número de iteraciones para la colocación de los nodos para ser "estable". Tenga en cuenta que estas iteraciones no es necesario que se muestra de modo que se puede ejecutar en segundo plano y hacer que el resultado final.

No he utilizar JUNG así que no puedo comentar mucho sobre ella.

Con base en mi experiencia con prefuse le recomiendo que debido a la muy bien (en mi humilde opinión) pensada diseño y la separación de resposibility entre los componentes. Jeffrey Heer (prefuse autor) realmente hizo un buen trabajo allí.

Las cosas a tener en cuenta si se utiliza prefuse (estos son los dos "dolor-pulgares" que recuerdo vívidamente cuando se trabaja con prefuse):

1) Hay un error en el que cuando el zoom se aleja, las etiquetas de nodo no has alejado adecuadamente tal que desborda el cuadro delimitador del nodo que dejará artefactos dibujo de la fuente cuando el nodo se mueve debido a que el procesador sólo borra y vuelve a dibujar todo el material dentro el nodo de la caja de delimitación. IIRC esto es causado por un error en la fuente de AWT métrica en sí. La solución consiste en dejar un amplio margen entre la etiqueta y el cuadro delimitador nodo.

2) Al extender la incorporada en los diseños, puede encontrarse con uno o dos "cuestión de alcance", donde un miembro de la superclase que le gustaría tener acceso a se le da el atributo privado en lugar de protegerse así que la solución es ya sea a modificar la propia biblioteca o crear una nueva clase sin que enheriting (que puede ser un poco doloroso!). Creo que se puede decir lo mismo de algunas otras bibliotecas de Java. No todo el mundo tiene el beneficio de la retrospectiva que no? :)

Ya que esta pregunta hace un mes (en el momento de escribir este me) Me gustaría saber cuál era su decisión y así ha sido para usted si usted siguió adelante con la ejecución.

Otros consejos

Soy uno de los creadores y mantenedores de JUNG, por lo que tener esto en cuenta para las respuestas de abajo.

En primer lugar, sin embargo, debo decir que el autor de Prefuse es un amigo de un amigo (y sí, nos hemos conocido) y que ha hecho un gran trabajo. No estoy experimentado con Prefuse, pero he visto algunas visualizaciones hermosas creadas con él.

Aquí están las respuestas a estas preguntas para JUNG. Varios de ellos ((1), (2), (4) se demuestran en PluggableRendererDemo:

  1. Con el apoyo (que necesitará el modelo correcto de datos, no todos los bordes paralelos de apoyo por razones de rendimiento)
  2. Con el apoyo (de nuevo, se necesita el modelo de datos de la derecha)
  3. Apoyado (ver ImageShaperDemo)
  4. Apoyado (la mayoría de demos)
  5. Apoyado (ver GraphEditorDemo)
  6. No soportado directamente, aunque ciertamente puede cambiar dinámicamente las etiquetas y el uso de HTML para hacer etiquetas complejas.
  7. algoritmos de diseño de Jung son más para las redes generales (con algunas excepciones para los árboles, etc.). Por supuesto que puede construir sus propios algoritmos de diseño, sin embargo, y muchos lo han hecho.

Espero que esto ayude.

Yo sé que ha especificado Jung y prefuse pero ... He tenido una buena experiencia con ambos TomSawyer y yFiles. una lista de los requisitos que propuesto es muy básica para estos dos -. y apoyan mucho más

Ran.

Te sugiero evaluar JGraph también.

Me gusta la respuesta de @ holygeek. Aquí está mi aplicación a la solución de 2 (ambos dirigidos y no dirigidos bordes), por Prefuse:

public class MyRenderFactory implements RendererFactory
{
    private NodeRenderer nodeRenderer = new NodeRenderer();
    private EdgeRenderer defaultEdgeRenderer = new EdgeRenderer();
    private EdgeRenderer undirectedEdgeRenderer = new EdgeRenderer(EdgeRenderer.EdgeType.LINE, EdgeRenderer.EdgeArrowType.NONE);

    public static String directedness = "myEdgeDirectedness";

    public enum EdgeDirected
    {
        directed, undirected;

        public static EdgeDirected fromIsDirected(boolean isDirected)
        {
            if (isDirected)
            {
                return directed;
            }
            return undirected;
        }
    }

    @Override
    public Renderer getRenderer(VisualItem<?> visualItem)
    {
        if (visualItem instanceof EdgeItem)
        {
            if (visualItem.get(directedness).equals(PrefuseGraphConverter.EdgeDirected.undirected))
            {
                return undirectedEdgeRenderer;
            }
            return defaultEdgeRenderer;
        }
        return nodeRenderer;
    }
}

... en otros lugares, donde se crea el gráfico ...

MyRenderFactory.EdgeDirected directedness =
        MyRenderFactory.EdgeDirected.fromIsDirected(myEdge.isDirected());
prefuseEdge.set(MyRenderFactory.directedness, directedness);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top