Ich habe eine PreFuse-Anwendung, die GraphML-Dateien lädt, wo die Knoten eine "Farbe" -Eigenschaft haben. dh.GraphML Node Coloring Prefuse
<node id="1">
<data key="Color">Green</data>
<node>
Ich möchte eine Reihe von vordefinierten Farben zu ermöglichen, zu spezifizieren, und ich will nicht, um das Programm zu zwingen, die die GraphML schafft alle Farben zu verwenden.
Ich dachte, das wäre eine einfache Aufgabe (und vielleicht ist es?), Aber Prefuse scheint mich auf Schritt und Tritt zu bekämpfen. Ich habe zwei Teillösungen gefunden, aber beide haben ihre Probleme. Mein erster Ansatz war, um manuell eine neue Integer-Eigenschaft hinzufügen, die auf die „Farbe“ Strings korreliert, etwa so:
// 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;
}
}
}
Dann Sie prefuse der Standard-Farbmanager verwenden können, diese ganzen Zahlen Array-Indizes zu verknüpfen.
draw.add(new DataColorAction("graph.nodes", "ColorNumber", Constants.NUMERICAL, VisualItem.FILLCOLOR, fillArray));
Das größte Problem bei diesem Ansatz (auf es unelegant ist), ist, dass es, wenn weniger als drei einzigartige Farben nicht vom Benutzer festgelegt werden. Wenn zwei Farben angegeben sind, verwendet prefuse das erste und letzte Element des Farbarrays. Wenn einer, der erste. Meh.
Meine andere Lösung besteht darin, die Farbe jedes Knotens manuell festzulegen.
// 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();
Dies funktioniert für eine beliebige Anzahl von Farben, aber zufällig vermasselt. Ich denke, dass Prefix diese Methoden auf ihrem eigenen Thread behandelt, der aus irgendeinem Grund langsam ausgeführt wird. Für kleinere Netzwerke kann ich eine feste Wartezeit festlegen (ich habe keine Thread.join() -Methode gefunden). Aber das scheitert urkomisch (lies: stürzt meinen Computer ab) für große Netzwerke.
Also, da hast du es. Ein unnötig großer Zeitaufwand für das, was eine triviale Aufgabe sein sollte. Hat jemand das geschafft? Gibt es einen einfachen Weg? Bitte sag mir, dass ich das überbewerte.
Erweitern von DataColorAction ist die Lösung, die ich am Ende ging. Außerdem muss ich bei StackOverflow-Fragen besser nachgehen. – PattimusPrime