comparant open source cadres de dessin graphique java (Jung et Prefuse) pour dessiner la topologie du réseau

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

Question

lequel des cadres de dessin graphique Java open source à utiliser pour un schéma de réseau avec les exigences suivantes? Le graphique aura moins de 1000 nœuds.

1) présente des bords parallèles
2) réalisé et les bords undirected dans un seul graphe
3) des noeuds représentés par des images
4) l'interaction de l'utilisateur avec des noeuds et des arêtes
5) l'ajout / suppression dynamique des noeuds et des arêtes
6) l'étiquetage multiple sur les nœuds et les arêtes, les différents niveaux de marquage peuvent être désactivés / par les utilisateurs. (Comme le dessin en couches et en éteignant / sur une couche)
7) les différents algorithmes de mise à l'étoile d'affichage, l'anneau, les topologies maillage

Je JUNG et évalué Prefuse. Ce que j'ai trouvé pour chacun de mes besoins.

1) ne peut pas afficher Prefuse bords parallèles tandis que JUNG supporte. Peut être manipulé le code Prefuse pour afficher des bords parallèles? Étant donné que cela implique le niveau des données de base des changements que je crois que ce serait plus difficile que les changements d'habitude de rendu personnalisé.

2) i na trouver aucune référence à graphique combiné (les deux bords orientés et non orientés) dans les deux prefuse et JUNG. Est-ce que quelqu'un sait autrement?

3) Cela semble facile à la fois Prefuse et JUNG

4) Encore une fois tous les deux prefuse et JUNG fournit un support pour une interaction utilisateur.

5) Les deux Prefuse et soutient JUNG il. Comment effectuer chaque cadre en redessiner le graphique? J'ai vu dans un autre poste que Prefuse ne fonctionne pas bien pour les mises à jour dynamiques ( Prefuse Trousse dynamiquement en ajoutant des noeuds et des arêtes )

6) Cela revient à modifier le graphique et redessiner. La question devient donc la même chose que 5)

7) Les deux JUNG et Prefuse a plusieurs algorithmes de mise en page. Mais quand j'ai essayé d'afficher le même ensemble de données en utilisant FruchtermanReingoldLayout dans les deux JUNG et Prefuse je reçois différents affichages. Toutes les idées pourquoi? D'une certaine manière les algorithmes de mise en page Prefuse semblent afficher une meilleure mise en page que dans JUNG (le rendu est mieux je pense) que la plupart des algorithmes de mise en page Prefuse sont basées sur la mise en œuvre JUNG. Prefuse mises en page tels que ForceDirectedLayout / FruchtermanReingoldLayout et CircleLayout cartes directement à l'étoile, cercle, topologies de maillage.

En dehors de ces exigences, Prefuse a un bon support pour les expressions et le langage de requête, mais ressemble à elle ne se développe pas activement à la différence JUNG. que l'on a une meilleure visualisation? Toute suggestion sur lequel sera approprié et la façon de surmonter les lacunes?

Les autres cadres là-bas que je peux utiliser?

Était-ce utile?

La solution

Quelques années (2007?) J'utilise Prefuse pour visualiser les enregistrements de données d'appel. Je considérais Prefuse, jung, jgraph et quelques autres et a choisi Prefuse. Au début, il est un peu difficile à envelopper la tête autour de Prefuse mais une fois que je suis familier avec elle, il est vraiment facile (pour prolonger) et amusant à utiliser. Je suppose que la même chose peut être dit pour JUNG, mais je ne l'ai essayé.

1) Prefuse il est très facile d'ajouter votre propre moteur de rendu personnalisé pour le dessin des bords parallèles - vous pouvez créer une sous EdgeRenderer par défaut et remplacer la méthode render (). Il n'y a pas « changements de niveau de données de base nécessaires ». Tout cela est dans la partie de vue si vous souhaitez penser comme une substance MVC.

2) Ce n'est pas vraiment un problème du tout. Il y a plus d'une façon de le faire: 1) Vous pouvez avoir deux équarrisseurs - un pour tirer les bords dirigés et un pour tirer les bords et non orientés ils vont travailler très bien, et le groupe des bords de façon appropriée. 2) mettre un drapeau (ajouter une colonne booléenne dans la table de support tuple dans parler de prefuse) pour indiquer si le bord est dirigé et sauter la partie de dessin de flèche en conséquence dans le EdgeRender selon ce drapeau.

3) C'est super facile

4) idem

5) La dernière version de Prefuse est "version bêta de Prefuse 21/10/2007". Je celle d'avant, qui ont une condition de course possible lors de l'ajout ou la suppression de nœuds dynamiquement - il manquait quelques mots-clés synchronisés, je suppose. Je résolu qu'en veillant à arrêter toute l'animation et les actions (couleur, taille, mise en page) lors de l'ajout ou la suppression des nœuds - aussi ne pas oublier de mettre à jour vos index de Lucene ainsi (si vous utilisez son intégré dans le moteur de recherche Lucene ). Le dernier est censé résoudre ce problème de la course mais je jamais eu la chance de l'essayer.

6) Puisque vous avez mentionné « l'étiquetage multiple » Je pense que ce pas une question de « modifier le graphique et redessiner » - il est juste une question de personnaliser votre étiquette / bord équarrisseurs pour dessiner uniquement les étiquettes pertinentes donc ce n'est pas vraiment un gros problème. Aussi je ne pense pas que cela est lié à 5 du tout.

7) Je ne suis pas surpris que Prefuse et le rendu de JUNG du FruchtermanReingoldLayout sont différentes - il y a quelques facteurs qui pourraient avoir une incidence sur celui-ci d'entre eux le noeud de départ où chaque mise en œuvre démarrer le calcul, donc je ne vous inquiétez pas beaucoup au sujet de ce problème. Il est assez facile d'essayer les différents algorithmes de mise en page de graphique intégré dans Prefuse afin que vous puissiez aller de l'avant et de vérifier que l'on est plus proche de ce que vous aimeriez avoir. Consultez la RadialLayout et BalloonTreeLayout pour la mise en page étoiles. ForceDirectedLayout a besoin tout à fait quelques itérations pour le placement des nœuds à « stable ». Notez que ces itérations est pas nécessaire d'être montré que vous pouvez l'exécuter en arrière-plan et de rendre le résultat final.

Je ne l'ai pas utiliser JUNG donc je ne peux pas beaucoup de commentaires à ce sujet.

Sur la base de mon expérience avec Prefuse je le recommande vivement en raison de la très bien (à mon humble avis) Conception étudiée et la séparation des resposibility entre les composants. Jeffrey Heer (auteur de Prefuse) a vraiment fait un bon travail là-bas.

Les choses à surveiller si vous utilisez Prefuse (ce sont les deux « mal-pouces » que je me souviens très bien quand on travaille avec Prefuse):

1) Il y a un bug lors d'un zoom sur les étiquettes de nœuds ne sont pas zoomées de manière appropriée telle qu'elle déborde du cadre de sélection du nœud qui laissera des objets de dessin de police lorsque le noeud se déplace parce que le moteur de rendu efface uniquement et redessine farcir dans les le noeud est boîte englobante. IIRC cela est causé par un bogue dans AWT police métrique elle-même. La solution consiste à laisser une marge suffisante entre l'étiquette et la boîte de limitation du noeud.

2) En cas d'extension intégré mises en page, vous pouvez rencontrer un ou deux « question la portée », où un membre de la superclasse que vous souhaitez avoir accès à l'attribut est donnée privée au lieu de protéger la solution est donc de modifier soit la bibliothèque elle-même ou créer une nouvelle classe sans enheriting (qui peut être un peu douloureux!). Je suppose que vous pouvez dire la même chose pour d'autres bibliothèques java. Pas tout le monde a le recul non? :)

Depuis que vous avez demandé il y a cette question sur un mois (au moment de me écrire cela) Je voudrais savoir ce que votre décision était et comment il est apparu pour vous si vous êtes allé de l'avant avec la mise en œuvre.

Autres conseils

Je suis l'un des créateurs et mainteneurs de JUNG, donc en tenir compte pour les réponses ci-dessous.

Mais d'abord, je dois dire que l'auteur de Prefuse est un ami d'un ami (et oui, nous avons rencontré) et il a fait un excellent travail. Je ne suis pas connu avec Prefuse, mais je l'ai vu quelques belles visualisations créées avec elle.

Voici les réponses à ces questions pour JUNG. Plusieurs d'entre eux ((1), (2), (4) sont démontrés dans PluggableRendererDemo:

  1. pris en charge (vous aurez besoin du modèle de données à droite, tous les bords support parallèles pour des raisons de performance)
  2. pris en charge (encore une fois, vous avez besoin du modèle de données à droite)
  3. pris en charge (voir ImageShaperDemo)
  4. pris en charge (la plupart des démos)
  5. pris en charge (voir GraphEditorDemo)
  6. Non pris en charge directement, mais vous pouvez certainement changer les étiquettes dynamiquement et à utiliser HTML pour rendre les étiquettes complexes.
  7. Les algorithmes de mise en page de JUNG sont plus pour les réseaux généraux (à quelques exceptions près pour les arbres, etc.). Vous pouvez certainement construire vos propres algorithmes de mise en page, cependant, et beaucoup ont fait.

Hope this helps.

Je sais que vous avez spécifié jung et Prefuse mais ... J'ai eu une bonne expérience avec les deux TomSawyer et yFiles. Les exigences que vous liste proposée est très simple à ces deux -. Et ils prennent en charge beaucoup plus

Ran.

Je vous suggère d'évaluer JGraph aussi.

J'aime la réponse de @ holygeek. Voici ma mise en œuvre à la solution de 2 (à la fois dirigé et bords non orientés), pour 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;
    }
}

... ailleurs, où le graphique est créé ...

MyRenderFactory.EdgeDirected directedness =
        MyRenderFactory.EdgeDirected.fromIsDirected(myEdge.isDirected());
prefuseEdge.set(MyRenderFactory.directedness, directedness);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top