2014-07-01 16 views
6

Ich habe eine SimpleWeightedGraph und ich möchte es auf einem JPanel in einem JFrame zeichnen. Leider ist nichts gezeichnet.Zeichnen einer SimpleWeightedGraph auf einem JPanel

Ich lese this article. Sie verwenden eine ListenableDirectedGraph, also versuchte ich eine ListenableUndirectedGraph ohne Erfolg.

public class DisplayGraphForm extends javax.swing.JFrame { 
    public DisplayGraphForm(SimpleWeightedGraph g) { 
     initComponents(); // graphPanel added to JFrame with BorderLayout (Center) 

     JGraphModelAdapter adapter = new JGraphModelAdapter(g); 

     JGraph jgraph = new JGraph(adapter); 
     graphPanel.add(jgraph); 
    } 
} 

Antwort

12

Es sieht aus, dass Sie einige wichtige Details aus Ihrer Frage sind verlassen, und ohne Minimal, Complete, and Verifiable example ist es schwer zu sagen, wo das Problem ist.

Beachten Sie jedoch, dass die Probe, die Sie übernehmen möchten, sehr alt ist. JGraph ist weitergegangen auf JGraphX. Stellen Sie sich das folgende Beispiel vor, das die Verknüpfung von und JGraphX unter Verwendung von JGraphXAdapter veranschaulicht.

import javax.swing.JFrame; 
import javax.swing.SwingUtilities; 

import org.jgrapht.ListenableGraph; 
import org.jgrapht.ext.JGraphXAdapter; 
import org.jgrapht.graph.DefaultWeightedEdge; 
import org.jgrapht.graph.ListenableDirectedWeightedGraph; 
import com.mxgraph.layout.mxCircleLayout; 
import com.mxgraph.layout.mxIGraphLayout; 
import com.mxgraph.swing.mxGraphComponent; 

public class DemoWeightedGraph { 

    private static void createAndShowGui() { 
     JFrame frame = new JFrame("DemoGraph"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     ListenableGraph<String, MyEdge> g = buildGraph(); 
     JGraphXAdapter<String, MyEdge> graphAdapter = 
       new JGraphXAdapter<String, MyEdge>(g); 

     mxIGraphLayout layout = new mxCircleLayout(graphAdapter); 
     layout.execute(graphAdapter.getDefaultParent()); 

     frame.add(new mxGraphComponent(graphAdapter)); 

     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       createAndShowGui(); 
      } 
     }); 
    } 

    public static class MyEdge extends DefaultWeightedEdge { 
     @Override 
     public String toString() { 
      return String.valueOf(getWeight()); 
     } 
    } 

    public static ListenableGraph<String, MyEdge> buildGraph() { 
     ListenableDirectedWeightedGraph<String, MyEdge> g = 
      new ListenableDirectedWeightedGraph<String, MyEdge>(MyEdge.class); 

     String x1 = "x1"; 
     String x2 = "x2"; 
     String x3 = "x3"; 

     g.addVertex(x1); 
     g.addVertex(x2); 
     g.addVertex(x3); 

     MyEdge e = g.addEdge(x1, x2); 
     g.setEdgeWeight(e, 1); 
     e = g.addEdge(x2, x3); 
     g.setEdgeWeight(e, 2); 

     e = g.addEdge(x3, x1); 
     g.setEdgeWeight(e, 3); 

     return g; 
    } 
} 

enter image description here

anzumerken, dass MyEdgeDefaultWeightedEdge benutzerdefinierte toString() das Kantengewicht zeigt bereitzustellen erstreckt. Eine sauberere Lösung wäre wahrscheinlich, mxGraph.convertValueToString zu überschreiben, den Inhalt von Zellen zu untersuchen und benutzerdefinierte Etiketten nach Bedarf bereitzustellen. toString ist eine Abkürzung für die Demo und auch ich habe festgestellt, dass DefaultWeightedEdge.getWeight() geschützt ist, so dass die Erweiterung sowieso benötigt wird :)