如何用Java中的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) 

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

谢谢 :)

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

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

此方法将旋转文本并将渲染所有其他形状相同。

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

如果您不想使用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); } 

用法:

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

我有一段代码与以下内容,我已添加包括Rectangle对象。 我可以看到我的文字正在旋转,而不是矩形。

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

也许你可以试试这个。