2010-03-17 81 views

回答

13

嗯,我不知道这个问题的答案,但经过一些调整后,并与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); 
    } 
} 

另外请注意,您可以通过调用得到的字符串中的单个字符的字符串:

​​
+1

太好了 - 我接受这个,因为它是一个完整的和可以理解的例子。我很困惑,因为看起来有两种方法可以做到这一点。您使用的GlyphVector方法以及@objects回答的TextLayout方法。除了字体和文本字符串,GlyphVector()似乎只需要一个FontRenderContext,但TextLayout需要一个FontRenderContext和一个AffineTransform,所以不知道每个方法的优点和缺点。 – 2010-03-18 14:02:04

+0

确实......听到Sun员工(或者有关此事的有经验的人)的差异会很有趣。看来,TextLayout用于许多文字字形相关的操作,如插入符号形状,切换字符......我最初认为,其中一个必须是API的新增加,但从我可以看到两个类存在于1.4 API(对于我和许多这是第一个足以称为Java:P的版本)。 – 2010-03-18 14:10:27

0

如果我理解正确的话,这是不是为了解决您确切的答案,但它是一个开始......

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

总结,

  1. 创建BufferedImage对象widthheightImageType
  2. 获取图片的Graphics对象。
  3. 油漆图形像请你(即创建一个矩形,圆形,文本等)
  4. 编写图像流(文件的ServletRequest等)
+0

谢谢,但我想留在矢量图形 – 2010-03-18 13:52:35

+0

我建议你对你的问题变得更加谨慎,然后@Jason S.我们正在努力提供帮助,但是我们无法理解你的想法。 – 2010-03-18 23:09:34

+0

??我很感激这个帮助,但是我的问题特别提出了如何将文本转换为Shape,如'java.awt.Shape'中所示。 – 2010-03-19 13:54:29

5

使用TextLayout类(请参阅getOutline()方法)。 Theres an example here

+0

+1:看到我对@Sawas – 2010-03-18 14:02:25

+0

答案的评论,我们的答案显然是正确的...... :) – 2010-03-18 14:08:09

+0

这个例子稍微紧凑一些,比接受的答案要干净得多。 http://www.java2s。COM /代码/ Java的/ 2D图形的GUI/OutlineFontpaint.htm – planty182 2015-08-27 13:34:38