1

ノードに「Color」文字列プロパティがあるGraphMLファイルをロードするプリヒューズアプリケーションがあります。すなわち。

<node id="1">
  <data key="Color">Green</data>
<node>

事前定義された色の範囲を指定できるようにしたいのですが、GraphMLを作成するプログラムにすべての色を使用させたくありません。

これは簡単な作業だと思いましたが(多分そうですか?)、prefuseは毎回私と戦うようです。私は2つの部分的な解決策を考え出しましたが、どちらにも問題があります。私の最初のアプローチは、次のように、「Color」文字列に相関する新しいIntegerプロパティを手動で追加することでした。

// Add new property to Graph g
g.addColumn("ColorNumber", int.class);

// Add property to each node   
Iterator<Node> it = g.nodes();
while(it.hasNext()) {
    Node n = it.next();
    String type = n.getString("Color");
    // Compare to an array of accepted types
    for(int i=0; i < colorMap.length; i++) {
        if(type.equalsIgnoreCase(colorMap[i])) {
            n.setInt("ColorNumber", i);
            break;
        }
    }
}

次に、prefuseのデフォルトのカラーマネージャを使用して、これらの整数を配列インデックスにリンクできます。

draw.add(new DataColorAction("graph.nodes", "ColorNumber", Constants.NUMERICAL, VisualItem.FILLCOLOR, fillArray));

このアプローチの最大の問題は(エレガントではないことに加えて)、ユーザーが3つ未満の固有の色を指定すると失敗することです。2つの色が指定されている場合、prefuseはカラー配列の最初と最後の要素を使用します。もしあれば、最初。まあ。

私の他の解決策は、各ノードの色を手動で設定することです。

// Iterate over VisualItems in Visualization vis
Iterator<VisualItem> v_it = vis.items("graph.nodes");
while(v_it.hasNext()) {
    VisualItem item = v_it.next();
    String type = item.getString("Color");
    for(int i=0; i < typeMap.length; i++) {
        if(type.equalsIgnoreCase(typeMap[i])) {
            item.setFillColor(fill[i]);
            item.setEndFillColor(fill[i]);
            break;
        }
    }
}
vis.repaint();

これは任意の数の色で機能しますが、ランダムに混乱します。prefuseは、何らかの理由で実行速度が遅い独自のスレッドでこれらのメソッドを処理すると思います。小規模なネットワークの場合、固定の待機時間を設定できます(使用するThread.join()メソッドが見つかりません)。しかし、これは大規模なネットワークでは陽気に失敗します(読んでください:私のコンピューターをクラッシュさせます)。

だから、あなたはそれを持っています。些細な作業であるべきことに対する不必要に長い時間のコミットメント。誰かがこれを達成することができましたか?簡単な方法はありますか?私はこれを考えすぎていると言ってください。

4

1 に答える 1

1

私はプリフューズについてのそのような経験をよく知っています:-/

最初のアプローチは正しい方法ですが、間違ったデータ型を指定しました。色はNOMINAL変数です。

DataColorAction color = new DataColorAction("graph.nodes", "Color",
    Constants.NOMINAL, VisualItem.FILLCOLOR, fillArray);

ColorNumberフィールドは必要ありません。

2番目のアプローチについてのあなたの結論は正しいです。prefuseはActionList別のスレッドで実行されます。したがって、視覚的なプロパティを手動で設定しないでください。

よりきめ細かいコードが必要な場合は、を拡張できますDataColorAction

于 2012-04-05T13:09:03.787 に答える