2012-04-10 2 views
12

Voglio ruotare il testo su un JPanel usando Graphics2D ..Come ruotare il testo con Graphics2D in Java?

Il mio codice è questo:

double paso=d.width/numeroBarras; 
     double alto=datos[i].valor; 
     Font fBarras=new Font("Serif", Font.PLAIN, 15); 
     g2.setFont(fBarras); 
     Rectangle2D barra=new Rectangle2D.Double(x,d.height-alto,paso,alto); 
     //g2.fill(barra); 
     x+=paso; 
     g2.draw(barra); 
     g2.rotate(-Math.PI/2); 
     g2.setColor(Color.BLACK); 
     g2.drawString(datos[i].titulo,(float)alto,(float)paso) 

Questo metodo deve disegnare un rettangolo e un testo sul rettangolo, ma quando ho eseguito questo metodo tutto la grafica è ruotato e voglio solo ruotare il testo ..

Grazie :)

risposta

22

il metodo si applica Graphics2D.rotate trasformare a tutte le operazioni di rendering successive. È possibile conservare una copia di trasformazione (con getTransform()) prima di applicare la rotazione e quindi ripristinare l'originale.

g2.draw(barra); 
AffineTransform orig = g2.getTransform(); 
g2.rotate(-Math.PI/2); 
g2.setColor(Color.BLACK); 
g2.drawString(datos[i].titulo,(float)alto,(float)paso); 
g2.setTransform(orig); 
+0

Questo ha funzionato perfettamente !! :) Grazie !! – rafuru

+0

Quindi ruota la stringa ma non il sistema di coordinate? – qed

+0

Modifica la corrente ['transform'] (http://docs.oracle.com/javase/7/docs/api/java/awt/Graphics2D.html#getTransform()) del contesto di rendering. ['Graphics2D'] (http://docs.oracle.com/javase/7/docs/api/java/awt/Graphics2D.html) afferma che la trasformazione viene utilizzata per convertire dal sistema di coordinate Spazio utente a Spazio dispositivo. Quindi ruota il sistema di coordinate :) L'ultima riga di questo esempio sta ripristinando la trasformazione dopo il rendering della stringa. – Mersenne

2

Ho un pezzo di codice con il seguente che ho aggiunto per includere oggetto Rectangle. Posso vedere il mio testo sta ruotando, non il rettangolo.

Graphics2D g2d = (Graphics2D) g; 
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 

String s = "dasdasdasd1"; 

Font font = new Font("Courier", Font.PLAIN, 12); 
g2d.translate(20, 20); 

FontRenderContext frc = g2d.getFontRenderContext(); 

GlyphVector gv = font.createGlyphVector(frc, s); 
int length = gv.getNumGlyphs(); 
Rectangle2D barra=new Rectangle2D.Double(0, 0, 700, 500); 
g2d.draw(barra); 
for (int i = 0; i < length; i++) { 
    Point2D p = gv.getGlyphPosition(i); 
    AffineTransform at = AffineTransform.getTranslateInstance(p.getX(), p.getY()); 
    at.rotate((double) i/(double) (length - 1) * Math.PI/3); 

    Shape glyph = gv.getGlyphOutline(i); 
    Shape transformedGlyph = at.createTransformedShape(glyph); 
    g2d.fill(transformedGlyph); 
} 

Potrebbe essere possibile provare con questo.

14

Questo metodo ruoterà il testo e renderà tutte le altre forme uguali.

Graphics2D g2 = (Graphics2D) g; 
Font font = new Font(null, Font.PLAIN, 10);  
AffineTransform affineTransform = new AffineTransform(); 
affineTransform.rotate(Math.toRadians(45), 0, 0); 
Font rotatedFont = font.deriveFont(affineTransform); 
g2.setFont(rotatedFont); 
g2.drawString("A String",0,0); 
g2.dispose(); 
+0

Questo è meglio (imho) rispetto alla soluzione accettata. – brimborium

+0

Questa soluzione ha funzionato perfettamente per me – gshauger

8

Questo codice è migliore e se non si desidera utilizzare AffineTransform.

public static void drawRotate(Graphics2D g2d, double x, double y, int angle, String text) 
{  
    g2d.translate((float)x,(float)y); 
    g2d.rotate(Math.toRadians(angle)); 
    g2d.drawString(text,0,0); 
    g2d.rotate(-Math.toRadians(angle)); 
    g2d.translate(-(float)x,-(float)y); 
}  

Usage:

drawRotate(g2d, 100, 100, 45, "hello world"); // 100x100px, 45 degree, 
+0

Questa dovrebbe essere la risposta accettata perché è più semplice e quindi si applica a una più ampia gamma di situazioni. +1. – CodeMed

+0

@CodeMed grazie per l'apprezzamento! :) – Danon