4

prefuse グラフ ツールキットを使用した経験のある人はいますか? すでに表示されているグラフを変更することはできますか? ノードやエッジを追加/削除し、表示を正しく適応させますか?

たとえば、 prefuse には、友人のネットワークを視覚化する例が付属しています。

http://prefuse.org/doc/manual/introduction/example/Example.java

私がやりたいことは、これに沿ったものです:

// -- 7. add new nodes on the fly -------------------------------------
new Timer(2000, new ActionListener() {
    private Node oldNode = graph.nodes().next(); // init with random node

    public void actionPerformed(ActionEvent e) {
        // insert new node //
        Node newNode = graph.addNode();

        // insert new edge //
        graph.addEdge(oldNode, newNode);

        // remember node for next call //
        oldNode = newNode;
    }
}).start();

しかし、うまくいかないようです。ヒントはありますか?

4

4 に答える 4

6

prefuse のいくつかの層に注意する必要があります。

  • データ
  • 視覚化
  • 画面

簡単に言うと、3 つのレイヤーは次のようにリンクできます。

Graph graph = new Graph(eg. yourXML_file);
Visualization viz = new Visualization();
viz.add(GRAPH, graph);
Display disp = new Display();
disp.setVisualization(viz);

ディスプレイは、通常どおりパネルに追加するグラフィック コンポーネントです。

ここでは、データ レイヤーのみを変更します。

Node newNode = graph.addNode();
graph.addEdge(oldNode, newNode);

ここで、ビジュアル レイヤーを更新する必要があります。

viz.run("repaint");

再描画アクションを定義する必要があります。

ActionList repaint = new ActionList();
repaint.add(new RepaintAction());
viz.putAction("repaint", repaint);

prefuse docを読むことを強くお勧めします。また、公式フォーラムで多くのリソースを見つけることができます

少なくとも、今のところ prefuse はライブ グラフの更新にはあまり効果的ではないと言えます。

しかし、グラフ構造を変更したため、視覚化でそれを再生成する必要があります (つまり、ノードの配置を再計算するなど...)。サンプル コードには、既に 2 つのアクションが定義されています。actionPerformed の最後にそれらを実行します。

viz.run("color");
viz.run("layout");

この方法は、ノードを追加するたびに多くの計算が追加されるため、あまり効率的ではありませんが、今のところ prefuse を使用する方法は他にありません。

于 2009-02-03T10:25:29.910 に答える
6

別の投稿で指摘したように、元の例で新しいノードとエッジが表示されない理由は、ノードの色などが正しく設定されていないためです。これを修正する 1 つの方法は、明示的に vis.run("color"); を呼び出すことです。ノードまたはエッジが追加されたときはいつでも。

または、カラー アクションを追加する ActionList (元の例では「color」と呼ばれる) を少し異なる方法で初期化することにより、カラー アクションが常に実行されていることを確認できます。

それ以外の

ActionList color = new ActionList();

私たちは書くことができました

ActionList color = new ActionList(Activity.INFINITY);

これにより、アクション リストが無期限に実行され続けるため、新しいノード/エッジは視覚的な外観のために自動的に初期化されます。

ただし、これが実際に推奨される方法であるかどうかは不明です。動的レイアウト アクション (ForceDirectedLayout など) などの場合、そのような宣言は完全に理にかなっていますが、色については、常に実行されている色付けアクションがほとんどの場合オーバーヘッド。

したがって、おそらく、グラフが拡張されるたびに「色」アクションを明示的に(ただし一度だけ)実行するという以前に投稿されたソリューションが、より良い選択かもしれません...

于 2009-02-06T12:01:10.730 に答える
2

さて、プレフューズのソースを少し掘り下げた後、私は今、物事がフードの下でどのように機能するかをよりよく理解しています. 実際、上記のコードで作成した新しいノードはグラフに正しく追加されているだけでなく、視覚化でもそれが記録されていることがわかりました。

したがって、ジェロームが示唆するのとは異なり、明示的に vis.run("layout") を呼び出す必要はありません。

ノードが正しく追加されていないと思った理由は、ノードが白い背景、境界線、およびテキストの色で描かれているという事実です。それらを見つけるのが少し難しいことは驚くべきことではありません。

これを修正するには、次のように、新しいノードが挿入された後に color アクションを呼び出す必要があります。

// insert new edge //
graph.addEdge(oldNode, newNode);
vis.run("color"); // <- this is new

(このアクションは //-- 4 の下の Example.jar のコードでさらに上に定義されていることに注意してください。)

最後に確信が持てないのは、このアクションを呼び出すと prefuse が再びすべてのグラフ ノードを調べて色を設定するかどうかです。

于 2009-02-06T09:31:36.817 に答える
0

コントロール コンテナ (example.java の 'd') に再描画を指示する必要があります。invalidate() を呼び出すだけで十分です (確かではありませんが)。

とにかく、これはあなたを助けるかもしれません。

于 2009-02-02T11:27:37.133 に答える