2012-04-10 39 views
12

que desea girar el texto en un JPanel usando Graphics2D ..Cómo rotar texto con Graphics2D en Java?

Mi código es la siguiente:

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) 

Este método debe dibujar un rectángulo y un texto sobre el rectángulo, pero cuando corro este método todos el gráfico se gira y sólo quiero girar el texto ..

Gracias :)

Respuesta

22

el método se aplica la transformada de Graphics2D.rotate a todas las operaciones de renderización posteriores. Puede conservar una copia de la transformación (con getTransform()) antes de aplicar la rotación, y luego restaurar el original.

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

Esto funcionó a la perfección !! :) Gracias !! – rafuru

+0

Entonces, ¿gira la cuerda pero no el sistema de coordenadas? – qed

+0

Modifica la versión actual ['transform'] (http://docs.oracle.com/javase/7/docs/api/java/awt/Graphics2D.html#getTransform()) del contexto de representación. ['Graphics2D'] (http://docs.oracle.com/javase/7/docs/api/java/awt/Graphics2D.html) reference indica que la transformación se usa para convertir el sistema de coordenadas del espacio de usuario al espacio del dispositivo. Por lo tanto, rota el sistema de coordenadas :) La última línea de este ejemplo es restaurar la transformación después de la representación de la cadena. – Mersenne

2

Tengo un fragmento de código con el siguiente en el que he añadido para incluir el objeto Rectangle. Veo que mi texto está girando, no el rectángulo.

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

Puede ser que usted puede intentar con esto.

14

Este método rotará el texto y representará el resto de las formas.

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

Esto es mejor (imho) que la solución aceptada. – brimborium

+0

Esta solución funcionó perfectamente para mí – gshauger

8

Este código es mejor y si no desea utilizar 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); 
}  

Uso:

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

Esta debería ser la respuesta aceptada porque es más simple y por lo tanto se aplica a una gama más amplia de situaciones. +1. – CodeMed

+0

@CodeMed ¡Gracias por tu agradecimiento! :) – Danon

Cuestiones relacionadas