2010-03-17 6 views

Répondre

13

Hm, je ne savais pas la réponse à cela, mais après un peaufinage peu et farfouillé avec le contenu Eclipse assiste j'ai trouvé ce qui semble être ce dont vous avez besoin:

EDIT: j'ai changé le code pour changer la façon dont la chaîne est affichée, c'est la raison pour laquelle vous avez demandé ce que vous avez demandé :) Essayez-le. Il rend la chaîne avec la couleur rouge et une note contour en pointillés

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

également que vous pouvez obtenir les caractères individuels de la chaîne en appelant:

getGlyphOutline(glyphIndex) 
+1

Super - Je l'accepte parce que c'est un exemple complet et compréhensible. Je suis perplexe parce qu'il semble qu'il y ait deux façons de le faire. L'approche GlyphVector que vous avez utilisée et l'approche TextLayout avec laquelle @objects a répondu. Vous ne savez pas quels sont les avantages/désavantages de chacun .... en plus d'une police et d'une chaîne de texte, GlyphVector() semble juste prendre un FontRenderContext, mais TextLayout prend un FontRenderContext et un AffineTransform. –

+0

en effet ... Il serait intéressant d'entendre un employé de Sun (ou quelqu'un d'expérimenté en la matière) sur les différences. Il semble que TextLayout soit utilisé pour de nombreuses opérations liées au glyphe de texte telles que les formes de caret, les caractères de changement ... J'ai d'abord pensé que l'une des deux devait être un nouvel ajout à l'API. API (pour moi et beaucoup c'est la première version assez digne d'être appelée Java: P). –

0

Si je vous ai bien compris, ce n'est pas pour répondre à votre réponse exacte, mais il est un début ...

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

En résumé,

  1. Créez un objet BufferedImage de width et height et ImageType. Obtient l'objet Graphics de l'image.
  2. peinture que les graphiques comme vous s'il vous plaît (à savoir créer un rectangle, cercle, texte, etc.)
  3. Ecrire cette image à un flux (fichier, ServletRequest, etc.)
+0

Merci, mais je veux rester dans les graphiques vectoriels –

+0

Je suggère que vous devenez plus discret avec votre question alors @Jason S. Nous essayons d'aider, mais nous ne pouvons pas lire ce qui est dans votre esprit. –

+0

?? J'apprécie l'aide, mais ma question a spécifiquement demandé comment convertir le texte en forme, comme dans 'java.awt.Shape'. –

5

Utilisez la classe TextLayout (voir la méthode getOutline()). Il y a un exemple here

+0

+1: voir mon commentaire sur la réponse de @Sawas –

+0

nos deux réponses sont corrects apparemment ... :) –

+0

cet exemple est un peu plus compact, beaucoup plus propre que la réponse acceptée aussi. http: //www.java2s.com/Code/Java/2D-Graphics-GUI/OutlineFontpaint.htm – planty182

Questions connexes