如何用Java中的Graphics2D旋转文本?

raf*_*uru 17 java awt graphics2d

我想使用Graphics2D在JPanel上旋转文本..

我的代码是这样的:

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)
Run Code Online (Sandbox Code Playgroud)

此方法必须在矩形上绘制一个矩形和一个文本,但是当我运行此方法时,所有图形都会旋转,我只想旋转文本.

谢谢 :)

Tit*_*tus 26

此方法将旋转文本并将所有其他形状呈现相同.

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();
Run Code Online (Sandbox Code Playgroud)


Mer*_*nne 24

该方法Graphics2D.rotate将变换应用于所有后续渲染操作.您可以getTransform()在应用旋转之前保留transform(with )的副本,然后还原原始文件.

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);
Run Code Online (Sandbox Code Playgroud)


Dan*_*non 14

如果您不想使用此代码更好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);
}    
Run Code Online (Sandbox Code Playgroud)

用法:

drawRotate(g2d, 100, 100, 45, "hello world");    // 100x100px, 45 degree, 
Run Code Online (Sandbox Code Playgroud)

  • 这应该是公认的答案,因为它更简单,因此适用于更广泛的情况。+1。 (2认同)