这是我用来表示UndirectGraph的代码。
我将节点对象和字符串加载到两个HashTable中,然后将其显示在一个框架中。我想更改节点标签的位置,我必须使用CircleLayout。
位于左侧的节点的标签顶部有图形的边缘,始终将其表示在节点的右侧。我需要左边的节点在左边有标签,至少要到总数的中间。
UndirectedGraph<String, String> graphStruct = new UndirectedSparseMultigraph<String, String>();
Hashtable<String, NodeData> nodeCollection = new Hashtable<String, NodeData>();
Hashtable<String, EdgeData> edgeCollection = new Hashtable<String, EdgeData>();
...
...
...
edgeCollection.put(""+edge, new EdgeClass(edge, "Id+"+edge));
...
...
...
VisualizationViewer<String, String> vv = new VisualizationViewer<String, String>(new FRLayout<String, String>(graphStruct));
vv.getRenderContext().setVertexFillPaintTransformer(new VertexColor(nodeCollection));
vv.getRenderContext().setEdgeLabelTransformer(new ToStringLabeller<String>());
vv.getRenderContext().setVertexLabelTransformer(new NodeId(nodeCollection));
JLabel label = new JLabel();
label.setOpaque(true);
label.setText("Graph");
vv.add(label);
PluggableGraphMouse inter = new PluggableGraphMouse();
inter.add(new TranslatingGraphMousePlugin(MouseEvent.BUTTON3_MASK));
inter.add(new PickingGraphMousePlugin());
inter.add(new ScalingGraphMousePlugin(new CrossoverScalingControl(), 0, 2 / 1.2f, 1.2f));
vv.setGraphMouse(inter);
vv.setPreferredSize(new Dimension(1600,1000));
vv.setLocation(500, 500);
vv.setGraphLayout(new CircleLayout(graphStruct));
final JFrame frame = new JFrame();
frame.setTitle("Graph Rappresentation");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(vv);
frame.pack();
frame.setVisible(true);我还会在图的一侧插入一个图例,根据图形的类型填充值。如果有人能帮我谢谢你,晚上好。
发布于 2014-10-30 17:54:27
荣格越来越强大。用它快速地进行良好的图形可视化是很容易的。当您想要配置或调整可视化时,基本的、常见的修改很容易,但更具体的修改可能有点繁琐。特别是,并不总是有合适的文档,您可能需要查看JUNG源代码来摸索它。(然而,几乎所有的事情似乎都是可能的,至少)。
在这种情况下,只需调用
vv.getRenderer().getVertexLabelRenderer().setPosition(Position.AUTO);在你的VisualizationViewer上。这将导致顶点的标签被放置“远离中心”。因此,当窗口的左上角区域有一个顶点时,标签将放置在顶点上方的左上角。
如果这还不够,您可以通过另外调用
vv.getRenderer().getVertexLabelRenderer().setPositioner(positioner);其中positioner是Positioner接口的批准实现。(实际上,当将位置设置为Position.AUTO时,它使用这个接口的一个实现,称为OutsidePositioner.)
对实际问题的描述确实很难理解,因此这里有两个图像显示了两者的区别:
在默认的顶点标签放置方式下,顶点标签可以画在边缘上(如此处用于顶点v2):

当将位置设置为Position.AUTO时,标签总是放置在“外部”:

这是一个MCVE
import javax.swing.JFrame;
import org.apache.commons.collections15.Transformer;
import edu.uci.ics.jung.algorithms.layout.FRLayout;
import edu.uci.ics.jung.graph.DirectedSparseMultigraph;
import edu.uci.ics.jung.graph.Graph;
import edu.uci.ics.jung.visualization.VisualizationViewer;
import edu.uci.ics.jung.visualization.renderers.Renderer.VertexLabel.Position;
public class JUNGVertexLabelPositionsTest
{
public static void main(String[] args)
{
JFrame f = new JFrame();
final Graph<String, String> g = getGraph();
VisualizationViewer<String, String> vv =
new VisualizationViewer<String, String>(
new FRLayout<String, String>(g));
Transformer<String, String> transformer = new Transformer<String, String>()
{
@Override
public String transform(String s)
{
return s;
}
};
vv.getRenderContext().setVertexLabelTransformer(transformer);
// Adjust the label placement based on the position
// of the vertex relative to the window:
vv.getRenderer().getVertexLabelRenderer().setPosition(Position.AUTO);
f.getContentPane().add(vv);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setSize(300,300);
f.setVisible(true);
}
public static Graph<String, String> getGraph()
{
Graph<String, String> g = new DirectedSparseMultigraph<String, String>();
g.addVertex("v");
for (int i=0; i<10; i++)
{
g.addVertex("v"+i);
g.addEdge("e"+i, "v", "v"+i);
}
return g;
}
}(关于传说:我不知道一个简单的解决办法,但你可以考虑把这个作为一个单独的问题)。
https://stackoverflow.com/questions/26659221
复制相似问题