2012-06-20 3 views
1

J'écris mon tout premier programme en Java qui fait réellement l'interface utilisateur, alors s'il vous plaît, gardez-moi si la réponse à cette question est évidente. J'utilise le JGraph 5 (5.14) pour visualiser un graphe créé par JGrapht (0.8.3).Mise en forme d'un graphe JGraph en utilisant com.jgraph.layout - actualisation de l'affichage

Je peux créer le graphique avec JGrapht très bien, et je crois qu'il est converti en JGraph OK en utilisant org.jgrapht.ext.JGraphModelAdapter. Le problème est que lorsque le résultat est affiché dans une fenêtre (j'utilise un panneau dans un JApplet), tous les sommets sont affichés les uns sur les autres.

Quelqu'un d'autre a eu ce problème (JGraph Layout Does Not Work) et j'ai essayé la solution présentée ici, mais seulement deux nœuds sont affichés. Fondamentalement, je veux juste que le graphique affiché d'une certaine manière où les nœuds sont séparés les uns des autres.

Une partie du code vaut mille mots, voici donc ce que j'ai actuellement, qui affiche seulement deux noeuds (il y a 219 dans le graphique):

class ourGraphVisualizer extends JApplet 
{ 

private static final Color DEFAULT_BG_COLOR = Color.decode("#FAFBFF"); 
private static final Dimension DEFAULT_SIZE = new Dimension(1280, 1024); 

// this init overrides the JApplet.init(). Our class here extends JApplet so we can do the visualization 
public void init(ListenableDirectedWeightedGraph<String, DefaultWeightedEdge> theGraph) 
{ 
    JGraphModelAdapter<String, DefaultWeightedEdge> jgAdapter; 

    JPanel panel = new JPanel(); 
    panel.setPreferredSize(DEFAULT_SIZE); 

    JScrollPane scrollpane = new JScrollPane(panel); 
    scrollpane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS); 
    scrollpane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); 

    this.getContentPane().add(scrollpane, BorderLayout.CENTER); 

    JFrame frame = new JFrame(); 

    frame.add(this); 
    frame.setTitle("Call Graph, " + theGraph.vertexSet().size() + "nodes"); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.pack(); 
    frame.setPreferredSize(DEFAULT_SIZE); 

    jgAdapter = new JGraphModelAdapter<String, DefaultWeightedEdge>(theGraph); 

    JGraph jgraph = new JGraph(jgAdapter); 

    panel.add(jgraph); 
    resize(DEFAULT_SIZE); 

    // Let's see if we can lay it out 
    JGraphFacade jgf = new JGraphFacade(jgraph); 
    JGraphFastOrganicLayout layoutifier = new JGraphFastOrganicLayout(); 
    layoutifier.run(jgf); 
    System.out.println("Layout complete"); 

    final Map nestedMap = jgf.createNestedMap(true, true); 
    jgraph.getGraphLayoutCache().edit(nestedMap); 

    jgraph.getGraphLayoutCache().update(); 
    jgraph.refresh(); 

    frame.setVisible(true); 
    panel.setVisible(true); 
    scrollpane.setVisible(true); 
} 

Toute suggestions constructives/help/l'inspiration sera très appréciée!

Merci ...

-Eric

+1

Salut user1055696 ... Non, je ne l'ai jamais fait fonctionner, alors j'ai punted. En utilisant JGraphT, j'ai exporté le graphe dans GraphML et ensuite utilisé Perfuse pour lire le GraphML et le visualiser. C'était un peu difficile, mais ça a marché! – Eric

Répondre

-1

Ce sera une bien meilleure idée de créer deux JPanels et ajoutez vos graphiques individuellement aux JPanels et les JPanels au JFrame en utilisant un gestionnaire de mise en page appropriée

+0

Merci, verdoyant, mais pourriez-vous préciser un peu les détails? En particulier, je n'ai qu'un seul graphique ... ai-je besoin de deux JPanels? Aussi, comment puis-je "... ajouter des graphiques au JPanel en utilisant un gestionnaire de disposition approprié?" Comment un gestionnaire de disposition interagit avec le JPanel? Merci encore pour votre réponse. – Eric

+0

Il semble que la «mise en page» à laquelle se réfère l'OP ne soit pas un «gestionnaire de disposition», comme on le dit souvent, mais un concept spécifique aux objets du graphique. –

+0

Vraiment, Andrew! La ligne: JGraphFastOrganicLayout layoutifier = new JGraphFastOrganicLayout(); fait référence à une classe com.jgraph.layout.graph – Eric

2

Si tu veux éviter le chevauchement de votre Vertex juste essayer différentes mise en page graphique i havegiven certains ici celui-ci pour la mise en page hiérarchique et appeler la méthode terme de cette

final JGraphHierarchicalLayout hir = new JGraphHierarchicalLayout(); 
final JGraphFacade graphFacade = new JGraphFacade(jgraph);  
hir.run(graphFacade); 
     final Map nestedMap = graphFacade.createNestedMap(true, true); 
     jgraph.getGraphLayoutCache().edit(nestedMap);