java/swing:将文本字符串转换为形状

Posted

技术标签:

【中文标题】java/swing:将文本字符串转换为形状【英文标题】:java/swing: converting a text string to a Shape 【发布时间】:2011-01-28 19:16:36 【问题描述】:

我想将一些任意文本转换为形状 (java.awt.Shape),然后描边/填充形状以绘制它。我该怎么做?

【问题讨论】:

不确定您的意思。你能详细说明吗?你想让文本变成文本中字符的形状吗? 【参考方案1】:

嗯,我不知道这个问题的答案,但经过一些调整和使用 Eclipse 内容辅助,我发现这似乎是你需要的:

编辑:我更改了代码来更改字符串的显示方式,这就是你问你问什么的原因:) 试试看。它用红色和虚线轮廓渲染字符串

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);
    

另请注意,您可以通过调用从字符串中获取单个字符:

getGlyphOutline(glyphIndex)

【讨论】:

太好了——我接受这个,因为它是一个完整且易于理解的例子。我很困惑,因为看起来有两种方法可以做到这一点。您使用的 GlyphVector 方法,以及 @objects 回答的 TextLayout 方法。不知道每个的优点/缺点是什么......除了字体和文本字符串之外,GlyphVector() 似乎只需要一个 FontRenderContext,但 TextLayout 需要一个 FontRenderContext 和一个 AffineTransform。 确实...听听 Sun 员工(或有相关经验的人)关于这些差异的意见会很有趣。似乎 TextLayout 用于许多与文本字形相关的操作,例如插入符号形状、切换字符......我最初认为两者之一必须是 API 的新添加,但从我可以看到这两个类都存在于 1.4 API(对我和许多人来说,这是第一个值得称为 Java 的版本:P)。【参考方案2】:

如果我理解正确的话,这并不是要回答你的确切答案,而是一个开始......

//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);

总之,

    创建widthheightImageTypeBufferedImage 对象。 获取图片的Graphics对象。 随意绘制图形(即创建矩形、圆形、文本等) 将该图像写入流(文件、ServletRequest 等)

【讨论】:

谢谢,但我想留在矢量图 我建议您比@Jason S 对您的问题更加谨慎。我们正在努力提供帮助,但我们无法读懂您的想法。 ??感谢您的帮助,但我的问题专门询问如何将文本转换为形状,如java.awt.Shape 好的,我现在才看到编辑后的问题。之前还不清楚。在您的问题下方查看@Holograham 的评论。最初我们不清楚您的问题。【参考方案3】:

使用TextLayout 类(参见getOutline() 方法)。 有一个例子here

【讨论】:

这个例子更紧凑,也比公认的答案更简洁。 java2s.com/Code/Java/2D-Graphics-GUI/OutlineFontpaint.htm

以上是关于java/swing:将文本字符串转换为形状的主要内容,如果未能解决你的问题,请参考以下文章

java swing里文本框控制不能输入汉字,或者输入字符串包含汉字在失去焦点事件时提示用户!

如何在 Java Swing 中获取工具提示文本字符串的宽度?

JAVA Swing学习之窗体文本显示

Java 将Word文档转换为PDF

OpenCV 将任意轮廓的形状转换为矩形

将文件路径拖放到 Java Swing JTextField