java/swing: converting a text string to a Shape

后端 未结 3 699
悲哀的现实
悲哀的现实 2020-12-06 06:29

I want to convert some arbitrary text to a Shape (java.awt.Shape) and then stroke/fill the Shape to draw it. How can I do this?

相关标签:
3条回答
  • 2020-12-06 06:36

    If I understood you correctly, this is not to address your exact answer, but it's a start...

    //Rough pseudo code
    import java.awt.Color;
    import java.awt.Font;
    import java.awt.FontMetrics;
    import java.awt.Graphics2D;
    import java.awt.TexturePaint;
    import java.awt.geom.AffineTransform;
    import java.awt.geom.Rectangle2D;
    import java.awt.image.BufferedImage;
    
    
    
    BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
    Graphics2D graphics = (Graphics2D)image.getGraphics();
    
    //Paint with texturing brush
    Rectangle2D rect2D = new Rectangle2D.Double(0, 0, width, height);
    graphics.setPaint(new TexturePaint(image, rect2D));
    graphics.fill(rect2D);
    
    //Draw text
    graphics.drawString("my text goes here", xPos, yPos);
    

    In Summary,

    1. Create a BufferedImage object of width and height and ImageType.
    2. Get the image's Graphics object.
    3. Paint that graphics like you please (i.e. create a rectangle, circle, text, etc.)
    4. Write that image to a stream (file, ServletRequest, etc.)
    0 讨论(0)
  • 2020-12-06 06:38

    Hm I did not know the answer to this but after a bit tweaking and poking around in with Eclipse content assist i found this which seems to be what you need:

    EDIT: i changed to code to change the way the string is displayed which is the reason you asked what you asked :) Try it. It renders the string with red color and a dashed outline

    import java.awt.BasicStroke;
    import java.awt.Color;
    import java.awt.Component;
    import java.awt.Dimension;
    import java.awt.Font;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.RenderingHints;
    import java.awt.Shape;
    import java.awt.font.GlyphVector;
    
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    
    public class Test extends JPanel{
    
        private Shape s;
    
        public Test() {
            Font f = getFont().deriveFont(Font.BOLD, 70);
            GlyphVector v = f.createGlyphVector(getFontMetrics(f).getFontRenderContext(), "Hello");
            s = v.getOutline();
            setPreferredSize(new Dimension(300,300));
        }
        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2 = (Graphics2D)g.create();
            g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
            g2.translate(100, 150);
            g2.rotate(0.4);
            g2.setPaint(Color.red);
            g2.fill(s);
        g2.setPaint(Color.black);
            g2.setStroke(new BasicStroke(3, BasicStroke.CAP_BUTT, BasicStroke.JOIN_ROUND, 1, new float[]{1,0.4f,1.5f}, 0));
            g2.draw(s);
        }
    
        public static void main(String[] args) {
            JFrame f = new JFrame("Test");
            Component c = new Test();
            f.getContentPane().add(c);
            f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            f.pack();
            f.setVisible(true);
        }
    }
    

    Also note that you can get the individual characters from the string by calling:

    getGlyphOutline(glyphIndex)
    
    0 讨论(0)
  • 2020-12-06 06:47

    Use the TextLayout class (see the getOutline() method). Theres an example here

    0 讨论(0)
提交回复
热议问题