簡體   English   中英

在JUNG圖形可視化中增加/設置頂點標簽

[英]Increase/Set vertex label in JUNG graph visualization

尋找一種使用JUNG Graph Visualization增加vertexLabel大小的方法 頂點本身大於其中的文本標簽,我想在不減小頂點本身大小的情況下平衡它們,從而獲得更美觀的視覺效果。 以下是我一直在鬼混的一些代碼:

import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Paint;
import java.awt.Shape;
import java.awt.geom.Ellipse2D;
import javax.swing.JComponent;
import javax.swing.JFrame;
import org.apache.commons.collections15.Transformer;
import edu.uci.ics.jung.algorithms.layout.ISOMLayout;
import edu.uci.ics.jung.algorithms.layout.Layout;
import edu.uci.ics.jung.graph.DirectedSparseMultigraph;
import edu.uci.ics.jung.graph.Graph;
import edu.uci.ics.jung.visualization.BasicVisualizationServer;
import edu.uci.ics.jung.visualization.decorators.ToStringLabeller;
import edu.uci.ics.jung.visualization.renderers.DefaultVertexLabelRenderer;
import edu.uci.ics.jung.visualization.renderers.Renderer.VertexLabel.Position;


public class GraphViewer extends JFrame {
    private static final long serialVersionUID = 1L;

    public GraphViewer(CustomObject user) {

        final Graph<CustomObject, String> graph = new DirectedSparseMultigraph<>();

        graph.addVertex(user);

        for (CustomObject friend: user.getFriends()) {
            graph.addVertex(friend);
            graph.addEdge(user.toString() + "-" + friend.toString(), user, friend);
        }

        Layout<CustomObject, String> layout = new ISOMLayout<>(graph);
        layout.setSize(new Dimension(1000, 800));

        BasicVisualizationServer<CustomObject,String> vv = new BasicVisualizationServer<>(layout);
        vv.setPreferredSize(new Dimension(1100,900));

        vv.getRenderContext().setVertexLabelTransformer(new ToStringLabeller<CustomObject>());
        vv.getRenderer().getVertexLabelRenderer().setPosition(Position.CNTR);

        final Color vertexLabelColor = Color.WHITE;

        DefaultVertexLabelRenderer vertexLabelRenderer = new DefaultVertexLabelRenderer(vertexLabelColor) {
                @Override
                public <V> Component getVertexLabelRendererComponent(
                    JComponent vv, Object value, Font font, 
                    boolean isSelected, V vertex) 
                {
                    super.getVertexLabelRendererComponent(vv, value, font, isSelected, vertex);
                    setForeground(vertexLabelColor);
                    return this;
                }
            };

        Transformer<CustomObject,Paint> vertexColor = new Transformer<CustomObject,Paint>() {
            public Color transform(CustomObject u) {
                // First user colored red
                // Any user other than first colored blue
                if(u.getUsername().equals(user.getUsername())) 
                    return Color.RED;
                return Color.BLUE;
            }
        };

        Transformer<CustomObject,Shape> vertexSize = new Transformer<CustomObject,Shape>(){
            public Shape transform(CustomObject u) {
                Graphics graphics = getGraphics();

                FontMetrics metrics = graphics.getFontMetrics();

                // Ellipse size is calculated by multiplying the username by a value
                int radius = (int) (metrics.stringWidth(u.toString()) * 4.5);
                return new Ellipse2D.Double(-15, -15, radius, radius);
            }

        };


        vv.getRenderContext().setVertexLabelRenderer(vertexLabelRenderer);
        vv.getRenderContext().setVertexFillPaintTransformer(vertexColor);
        vv.getRenderContext().setVertexShapeTransformer(vertexSize);

        setTitle(user.toString() + "'s Graph");
        setLocationRelativeTo(null);
        setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        getContentPane().add(vv);
        pack();
        setVisible(true);
    }

}

這是當前輸出的示例圖 我希望字體多填充頂點,甚至能夠操縱它們的屬性(粗體,斜體等)。

另外,如果您知道如何增加邊緣線的權重,那么我也希望獲得任何信息。

感謝您的光臨。 任何反饋表示贊賞。 對不起,它一團糟,尚在進行中,還遠遠沒有完成(很顯然)。

您可以設置VertexFontTransformer(例如):

    vv.getRenderContext().setVertexFontTransformer(new Transformer<CustomObject, Font>(){
        @Override
        public Font transform(CustomObject customObject) {
            return new Font("Helvetica", Font.BOLD, 30);

        }
    });

您可能要嘗試使用vertexShapeTransformer,因為您正在使用標簽的大小(受字體大小影響)來確定頂點的大小。

要增加邊緣線的權重,請執行以下操作:

    vv.getRenderContext().setEdgeStrokeTransformer(new Transformer<String,Stroke>(){
        @Override
        public Stroke transform(String s) {
            return new BasicStroke(5);
        }
    });
    vv.getRenderContext().setEdgeArrowStrokeTransformer(new Transformer<String,Stroke>(){
        @Override
        public Stroke transform(String s) {
            return new BasicStroke(5);
        }
    });

最后,要將頂點相對於邊緣放置在更好的位置,您可能需要這樣做:

return new Ellipse2D.Double(-radius/2, -radius/2, radius, radius);

代替這個:

return new Ellipse2D.Double(-15, -15, radius, radius);

(在將頂點轉換到所需位置之前,將其頂點定為原點)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM