2014-07-01 5 views
6

पर एक सरल WeightedGraph ड्राइंग मेरे पास एक SimpleWeightedGraph है और मैं इसे जेएफआरएएम में जेपीनल पर आकर्षित करना चाहता हूं। दुर्भाग्यवश कुछ भी नहीं खींचा गया है।एक जेपीनेल

मैंने this article पढ़ा। वे ListenableDirectedGraph का उपयोग कर रहे हैं, इसलिए मैंने बिना किसी सफलता के ListenableUndirectedGraph का प्रयास किया।

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); 
    } 
} 

उत्तर

12

ऐसा लगता है कि आप अपने सवाल से बाहर कुछ महत्वपूर्ण विवरण जा रहे हैं, और एक Minimal, Complete, and Verifiable example बिना यह कहना कहाँ समस्या है कठिन है।

हालांकि, ध्यान दें कि जिस नमूने को आप अपनाने का प्रयास कर रहे हैं वह बहुत पुराना है। JGraphJGraphX पर स्थानांतरित हो गया है। निम्नलिखित नमूना पर विचार करें जो JGraphXAdapter का उपयोग कर JGraphT और JGraphX का लिंक प्रदर्शित करता है।

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

ध्यान दें कि MyEdge फैली DefaultWeightedEdge कस्टम toString() कि धार वजन को प्रदर्शित करता है प्रदान करते हैं। एक क्लीनर समाधान शायद mxGraph.convertValueToString को ओवरराइड करना होगा, कोशिकाओं की सामग्री की जांच करें और आवश्यकतानुसार कस्टम लेबल प्रदान करें। toString डेमो के लिए एक शॉर्टकट है और मैंने यह भी देखा कि DefaultWeightedEdge.getWeight() संरक्षित है, इसलिए विस्तार की आवश्यकता है :)

संबंधित मुद्दे