2009-09-14 9 views
6

私は現在、グラフを描くのにJungを使用しています(私は本当にグラフではなくグラフです)!問題は、頂点とエッジラベルが頂点とエッジと重なっていることです。これは、不思議な見た目のグラフにつながります。問題は特定のレイアウトアルゴリズムに束縛されていません(FRLayoutを使用していますが)。JUNG(Java Graph):頂点ラベルとエッジラベルが重ならないようにするにはどうすればいいですか?

これらのオーバーラップを防ぐためにJUNGに伝える可能性はありますか?私はこれが既に実装されていると唯一の問題は、正しいオプションを見つけることです!

答えて

5

(以下の回答はJung2を前提としています;私はJung2の前に慣れていません)。

Jungの強みの1つは、非常に拡張性があり、容易に拡張できることです。 Jungでは、さまざまなトランス(単純なレンダリングプロパティ)、レンダラー(複雑なレンダリング)などをプラグインして、デフォルトが正しくないときの動作をカスタマイズできます。これらは通常、RenderContext(VisualizationViewerから取得できます)にインストールされます。

逆に、その欠点は、その複雑さと適切な文書化の欠如です。中程度から重度のカスタマイズを行う場合は、Jungのソースを掘り下げる必要があります。

たとえば、新しい頂点ラベルレンダラー(Renderer.VertexLabelインターフェイス)を差し込むことで、頂点ラベルレンダリングをカスタマイズできます。たとえば、BasicVertexLabelRendererをインスタンス化し、別の位置(北、西、中央など)を指定することができます。サークルをサークルよりも大きなものに変更したい場合は、ラベルを中央に置くことができます(これを行うには、Transformerのインスタンスである独自の頂点シェイプトランスをインストールします)。あるいは、ラベルテキストの下に背景をレンダリングするこのインタフェースの独自のカスタム実装を作成することもできます。

Renderer.EdgeLabel(JungのBasicEdgeLabelRendererを参照)の独自の調整版をインストールして、エッジラベルの位置をカスタマイズすることもできます。

2

私はこれが実装された方法だと思いますが、コードの作者はおそらくそれを問題として見ません。 JUNGの図書館はオープンソースなので、見た目には変更することができます。

コードを変更したくない場合は、ラベルを読みやすくするための簡単な修正は、ラベルの色を変更するだけで、エッジとは異なります。

6

ところで、色を変えたいのであれば、最初は大きな痛みがあるようです。あなただけのオフセットラベルを設定する必要が

Transformer labelTransformer = new ChainedTransformer<String,String>(new Transformer[]{ 
      new ToStringLabeller<String>(), 
      new Transformer<String,String>() { 
      public String transform(String input) { 
       return "<html><font color=\"yellow\">"+input; 
      }}}); 

context.setVertexLabelTransformer(labelTransformer); 
+3

このHTMLの使用がJUNGで文書化されている場所を知っていますか。言い換えれば、JUNGでHTMLを使用する可能性は何ですか? – madewael

7

vv.getRenderContext().setLabelOffset(20); 

VVがあなたのVisualizationViewerオブジェクトですが、私は最近、この小さなトリックを発見しました。

1

エッジラベルが重複して同じ問題が発生しました。私がエッジラベルを配置するのに使った素早く汚い解決策は、ある長さに文字列値の空白を埋め込むことです。

//pad some white spaces to value of edge when adding edges to the graph 
graph.addEdge(String.format("%-35s", "Edge-A"), 1, 2); 

特に、2部グラフを作成するときにエッジラベルが中央で曇ったり重なったりするのを避けることができます。これがあなたのうちの何人かを助けることを願っています!

関連する問題