2010-03-17 76 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