JUNG (Java Graph): Wie Vertex- und Kanten Labels von Überschneidungen zu verhindern?

StackOverflow https://stackoverflow.com/questions/1422665

  •  07-07-2019
  •  | 
  •  

Frage

Ich bin derzeit mit Jung Grafiken zu zeichnen (ich meine Graphen wirklich nicht Charts!). Das Problem ist, dass Vertex und Edge-Labels überschneiden sich mit den Scheiteln und den Rändern. Dies führt in seltsam aussehenden Graphen. Das Problem ist nicht auf einen bestimmten Layout-Algorithmus gebunden (obwohl ich habe FRLayout benutze).

Gibt es Möglichkeiten JUNG zu sagen, diese Überlappungen zu verhindern? Ich hoffte, dass dies bereits umgesetzt und das einzige Problem besteht darin, die richtigen Optionen zu finden!

War es hilfreich?

Lösung

(Die folgende Antwort wird davon ausgegangen Jung2, ich bin nicht vertraut mit pre-Jung2).

Einer der Jungs Stärken ist, dass es sehr dehnbar ist, und leicht erweitert. Jung kann Sie in verschiedenen Transformatoren (einfache Rendering-Eigenschaften), Renderer (komplexere Rendering), und so weiter stecken, um das Verhalten anpassen, wenn der Standard nicht ganz richtig ist. Diese sind in der Regel installiert auf dem Render (die Sie von Ihrem VisualizationViewer bekommen).

Auf der anderen Seite, sind seine Nachteile seiner Komplexität und der Mangel an menschenwürdige Dokumentation. Wenn Sie vorhaben, jede mittlere bis starke Anpassung zu tun, müssen Sie in die Jung Quelle graben.

Zum Beispiel kann das Vertex-Label-Rendering durch Einstecken einer neuen Vertex-Label-Renderer (Renderer.VertexLabel Schnittstelle) angepasst werden. Zum Beispiel können Sie BasicVertexLabelRenderer und die Angabe eine andere Position (Nord, West, Mitte, etc.) instanziiert. Sie könnten Ihr Etikett in dem Mittelpunkt stellen, wenn Sie bereit sind größer die Form in etwas zu ändern, als dieser Kreis (so zu tun, Ihre eigenen Vertex Form Transformator installieren - eine Instanz von Transformer). Alternativ können Sie eigene Implementierung dieser Schnittstelle erstellen, die einen Hintergrund unter dem Label Text macht.

Sie können auch Ihre eigene gezwickt Version von Renderer.EdgeLabel installieren (siehe Jung BasicEdgeLabelRenderer), um die Positionierung des Kanten Etikett anzupassen.

Andere Tipps

Sie müssen nur das Etikett setzen Offset:

vv.getRenderContext().setLabelOffset(20);

Wo vv ist der VisualizationViewer Objekt.

durch die Art und Weise, wenn Sie die Farbe ändern möchten, zunächst scheint es ein großer Schmerz zu sein. aber ich entdeckte vor kurzem diesen kleinen Trick:

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

Ich denke, das gerade ist, wie ihre Umsetzung, die Autoren des Codes wahrscheinlich sehen es nicht als ein Problem. Die JUNG Bibliothek ist Open-Source, so dass Sie willkommen sind, Änderungen zu machen, wie Sie für richtig halten.

Wenn Sie nicht möchten, dass der Code eine einfache Lösung zu ändern, die Etiketten besser lesbar zu machen wäre, einfach die Farbe der Etiketten zu ändern, so unterscheiden sie sich von den Rändern.

Ich habe das gleiche Problem von Edge-Labels überlappt angetroffen. Eine schnelle und schmutzige Lösung I verwendet, um die Kanten Labels Position wird durch eine bestimmte Länge mit weißen Zwischenräumen in dem Zeichenfolgenwert Polsterung.

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

Es wird die Kantenmarkierungen aus getrübt und überlappt in der Mitte vermeiden vor allem, wenn ein zweiteiliger Graph zu bauen. Hoffe, das da draußen einige von euch hilft!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top