首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >更改节点- Jung2中标签的位置

更改节点- Jung2中标签的位置
EN

Stack Overflow用户
提问于 2014-10-30 17:10:18
回答 1查看 1.1K关注 0票数 1

这是我用来表示UndirectGraph的代码。

我将节点对象和字符串加载到两个HashTable中,然后将其显示在一个框架中。我想更改节点标签的位置,我必须使用CircleLayout。

位于左侧的节点的标签顶部有图形的边缘,始终将其表示在节点的右侧。我需要左边的节点在左边有标签,至少要到总数的中间。

代码语言:javascript
复制
    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);

我还会在图的一侧插入一个图例,根据图形的类型填充值​​。如果有人能帮我谢谢你,晚上好。

EN

回答 1

Stack Overflow用户

发布于 2014-10-30 17:54:27

荣格越来越强大。用它快速地进行良好的图形可视化是很容易的。当您想要配置或调整可视化时,基本的、常见的修改很容易,但更具体的修改可能有点繁琐。特别是,并不总是有合适的文档,您可能需要查看JUNG源代码来摸索它。(然而,几乎所有的事情似乎都是可能的,至少)。

在这种情况下,只需调用

代码语言:javascript
复制
vv.getRenderer().getVertexLabelRenderer().setPosition(Position.AUTO);

在你的VisualizationViewer上。这将导致顶点的标签被放置“远离中心”。因此,当窗口的左上角区域有一个顶点时,标签将放置在顶点上方的左上角。

如果这还不够,您可以通过另外调用

代码语言:javascript
复制
vv.getRenderer().getVertexLabelRenderer().setPositioner(positioner);

其中positionerPositioner接口的批准实现。(实际上,当将位置设置为Position.AUTO时,它使用这个接口的一个实现,称为OutsidePositioner.)

对实际问题的描述确实很难理解,因此这里有两个图像显示了两者的区别:

在默认的顶点标签放置方式下,顶点标签可以画在边缘上(如此处用于顶点v2):

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

这是一个MCVE

代码语言:javascript
复制
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;
    }
}

(关于传说:我不知道一个简单的解决办法,但你可以考虑把这个作为一个单独的问题)。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26659221

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档