Я пытаюсь построить граф в JUNG таким образом, чтобы некоторые узлы в графе отображались и располагались по-разному.
Это код, который у меня есть до сих пор:
package example.ordering;
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JPanel;
import org.apache.commons.collections15.Transformer;
import org.apache.commons.collections15.functors.ChainedTransformer;
import edu.uci.ics.jung.algorithms.layout.FRLayout;
import edu.uci.ics.jung.graph.Graph;
import edu.uci.ics.jung.graph.SparseGraph;
import edu.uci.ics.jung.visualization.VisualizationViewer;
import edu.uci.ics.jung.visualization.renderers.VertexLabelAsShapeRenderer;
public class Main {
public static void main(String[] args) {
final JFrame frame = new JFrame();
frame.add(createGraph());
frame.setLocationRelativeTo(null);
frame.pack();
EventQueue.invokeLater(new Runnable() {
public void run() {
frame.setVisible(true);
}
});
}
private static JPanel createGraph() {
// TODO fill in the code to create a graph with nodes and order them.
Graph<GraphNode, String> g1 = new SparseGraph<GraphNode, String>();
GraphNode A = new GraphNode("A", "u");
GraphNode B = new GraphNode("B", "u");
GraphNode a = new GraphNode("a", "l");
GraphNode b = new GraphNode("b", "l");
g1.addEdge("AB", A, B);
// g1.addEdge("CD", "C", "D");
g1.addEdge("Aa", A, a);
g1.addEdge("Bb", B, b);
FRLayout<GraphNode, String> layout = new FRLayout<GraphNode, String>(g1);
VisualizationViewer<GraphNode, String> vv = new VisualizationViewer<GraphNode, String>(
layout);
VertexLabelAsShapeRenderer<GraphNode, String> vlasr = new VertexLabelAsShapeRenderer<GraphNode, String>(
vv.getRenderContext());
vv.getRenderContext().setVertexShapeTransformer(vlasr);
vv.getRenderContext().setVertexLabelTransformer(
new ChainedTransformer<GraphNode, String>(
new Transformer[] { new MyLabeller() }));
vv.getRenderer().setVertexLabelRenderer(vlasr);
return vv;
}
}
class GraphNode {
public String value;
public String type;
public GraphNode(String value, String type) {
this.value = value;
this.type = type;
}
@Override
public String toString() {
return value;
}
}
class MyLabeller implements Transformer<GraphNode, String> {
public String transform(GraphNode arg0) {
if (arg0.type.equals("u")) {
return arg0.value;
} else {
return "";
}
}
}
Теперь A и B отображаются как правильные прямоугольники с метками, тогда как a и b в нижнем регистре отображаются как маленькие тире, как у них нет этикетки.
Я хотел бы, чтобы все маленькие узлы case (с типом «l») отображались на одном уровне, отсортированные по алфавиту.
FRLayout
для «a» и «b», гдеISOMLayout
для «A» и «B» - person Ankit   schedule 27.11.2012