2012-04-10 65 views
12

我想旋轉使用的Graphics2D一個JPanel文本..如何在Java中使用Graphics2D旋轉文本?

我的代碼是這樣的:

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) 

此方法必須繪製矩形,在矩形文本,但是當我所有運行該方法圖形旋轉,我只是想旋轉文本..

謝謝:)

回答

22

的方法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); 
+0

這完美地工作! :) 謝謝 !! – rafuru 2012-04-14 21:01:59

+0

所以它旋轉的字符串,但不是座標系? – qed 2013-11-02 22:47:47

+0

它修改渲染上下文的當前['transform'](http://docs.oracle.com/javase/7/docs/api/java/awt/Graphics2D.html#getTransform())。 ['Graphics2D'](http://docs.oracle.com/javase/7/docs/api/java/awt/Graphics2D.html)參考指出,該轉換用於從用戶空間座標系轉換到設備空間。因此,它旋轉座標系:)本示例的最後一行是在字符串呈現後恢復變換。 – Mersenne 2013-11-04 08:44:27

2

我有一段代碼,下面我已經添加了包含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); 
} 

也許你可以試試這個。

14

此方法將旋轉文本並將呈現所有其他形狀相同。

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

這比接受的解決方案更好(imho)。 – brimborium 2016-05-19 16:21:09

+0

這個解決方案對我來說很完美 – gshauger 2017-09-07 01:40:53

8

此代碼更好,如果您不想使用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, 
+0

這應該是被接受的答案,因爲它更簡單,因此適用於更廣泛的情況。 +1。 – CodeMed 2015-04-01 19:14:08

+0

@CodeMed感謝您的讚賞!:) – Danon 2015-04-02 13:30:38