Java – draw simpleweightedgraph on JPanel
I have a simpleweightedgraph that I want to draw on JPanel in JFrame
I read this article They are using the listenabledirectedgraph, so I tried a listenableundirectedgraph but failed
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); } }
Solution
It seems that you have to leave some important details from your problem. Without the minimum, complete, and verifiable example, it is difficult to say where the problem is
But please note that the sample you are trying to use is very old JGraph has turned to jgraphx Consider the following example, which demonstrates the link between jgrapht and jgraphx using jgraphxaadapter
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; } }
Note that myedge extends defaultweightededge to provide a custom toString () that displays edge weights A cleaner solution might be to override mxgraph Convertvaluetostring to check the contents of cells and provide custom labels as needed ToString is a shortcut to the demo, and I also noticed defaultweightededge Getweight () is protected, so it needs to be extended anyway:)