加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 在JPanel上绘制SimpleWeightedGraph

发布时间:2020-12-14 23:31:49 所属栏目:Java 来源:网络整理
导读:我有一个SimpleWeightedGraph,我想在JFrame中的JPanel上绘制它. 不幸的是没有画出来. 我读了this article.他们正在使用ListenableDirectedGraph,所以我尝试了一个ListenableUndirectedGraph但没有成功. public class DisplayGraphForm extends javax.swing.J
我有一个SimpleWeightedGraph,我想在JFrame中的JPanel上绘制它.
不幸的是没有画出来.

我读了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);
     }
}

解决方法

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

但请注意,您尝试采用的样本非常陈旧. JGraph已经转向JGraphX.请考虑以下示例,该示例演示了使用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;
    }
}

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读