7

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

1 に答える 1

15

いくつかの重要な詳細を質問から除外しているように見えます.Minimal、Complete、およびVerifiableの例がなければ、問題がどこにあるのかを判断するのは困難です.

ただし、採用しようとしているサンプルは非常に古いものであることに注意してください。JGraphに移動しましたJGraphXJGraphTとのリンクを示す次のサンプルを検討してJGraphXくださいJGraphXAdapter

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拡張されていることに注意してください。よりクリーンな解決策は、おそらく をオーバーライドし、セルの内容を調べて、必要に応じてカスタム ラベルを提供することです。デモのショートカットであり、保護されていることに気付いたので、とにかく拡張機能が必要です:)DefaultWeightedEdgetoString()mxGraph.convertValueToStringtoStringDefaultWeightedEdge.getWeight()

于 2014-07-01T21:49:20.027 に答える