在JPanel上绘制SimpleWeightedGraph

我有一个SimpleWeightedGraph,我想在JFrame中的JPanel上绘制它。 不幸的是没有画出来。

我读了这篇文章 。 他们正在使用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); } } 

看起来你要从你的问题中留下一些重要的细节,如果没有Minimal,Complete和Verifiable示例 ,很难说问题出在哪里。

但请注意,您尝试采用的样本非常陈旧。 JGraph已经转向JGraphX 。 请考虑以下示例,该示例演示了使用JGraphXAdapterJGraphTJGraphX的链接。

 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 g = buildGraph(); JGraphXAdapter graphAdapter = new JGraphXAdapter(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 buildGraph() { ListenableDirectedWeightedGraph g = new ListenableDirectedWeightedGraph(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; } } 

在此处输入图像描述

请注意, MyEdge扩展了DefaultWeightedEdge以提供显示边缘权重的自定义toString() 。 一个更干净的解决方案可能是覆盖mxGraph.convertValueToString ,检查单元格的内容并根据需要提供自定义标签。 toString是演示的快捷方式,我也注意到DefaultWeightedEdge.getWeight()受到保护,所以无论如何都需要扩展:)