2010-03-17 7 views

risposta

13

Hm non sapevo la risposta a questo, ma dopo un po 'di tweaking e rovistando con contenuti Eclipse assistere ho trovato questo che sembra essere quello che ti serve:

EDIT: ho cambiato a codice per modificare il modo in cui viene visualizzata la stringa che è la ragione per cui hai chiesto cosa hai chiesto :) Provalo. Rende la stringa con il colore rosso e un contorno tratteggiato

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

Si noti inoltre che è possibile ottenere i singoli caratteri dalla stringa chiamando:

getGlyphOutline(glyphIndex) 
+1

Grande: lo accetto perché è un esempio completo e comprensibile. Sono perplesso perché sembra che ci siano due modi per farlo. L'approccio di GlyphVector che hai usato e l'approccio TextLayout con cui @objects ha risposto. Non sono sicuro quali siano i vantaggi/gli svantaggi di ciascuno .... oltre a un font e una stringa di testo, GlyphVector() sembra prendere solo un FontRenderContext, ma TextLayout accetta un FontRenderContext e un AffineTransform. –

+0

in effetti ... Sarebbe interessante ascoltare un dipendente Sun (o qualcuno che ha esperienza in materia) sulle differenze. Sembra che TextLayout sia usato per molte operazioni relative al glifo di testo come forme di caret, commutazione di caratteri ... Inizialmente pensavo che uno dei due debba essere una nuova aggiunta all'API ma da quello che posso vedere entrambe le classi esistevano nella 1.4 API (per me e molti questa è la prima versione abbastanza degna da essere chiamata Java: P). –

0

Se ho capito bene, questo non è per affrontare la risposta esatta, ma è un inizio ...

//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 sintesi,

  1. Creare un oggetto BufferedImage di width e height e ImageType.
  2. Ottiene l'oggetto Graphics dell'immagine.
  3. della vernice che la grafica come per favore (cioè creare un rettangolo, cerchio, testo, ecc)
  4. Scrivi quell'immagine in un flusso (file, ServletRequest, ecc)
+0

Grazie, ma voglio rimanere in grafica vettoriale –

+0

Ti suggerisco di diventare più discreto con la tua domanda allora @Jason S. Stiamo cercando di aiutare, ma non possiamo leggere quello che hai in mente. –

+0

?? Apprezzo l'aiuto, ma la mia domanda ha chiesto in particolare come convertire il testo in una forma, come in 'java.awt.Shape'. –

5

Utilizzare la classe TextLayout (vedi il metodo getOutline()). C'è un esempio here

+0

+1: guarda il mio commento sulla risposta di @Sawas –

+0

a quanto pare le nostre risposte sono corrette ... :) –

+0

questo esempio è un po 'più compatto, molto più ordinato della risposta accettata. http: //www.java2s.com/Codice/Java/2D-grafica-GUI/OutlineFontpaint.htm – planty182

Problemi correlati