2012-04-10 26 views
12

Tôi muốn xoay văn bản trên một JPanel sử dụng Graphics2D ..Làm thế nào để xoay văn bản với Graphics2D trong Java?

Mã của tôi là thế này:

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) 

Phương pháp này phải vẽ một hình chữ nhật và một văn bản qua hình chữ nhật, nhưng khi tôi chạy tất cả các phương pháp này đồ họa được quay và tôi chỉ muốn xoay văn bản ..

Cảm ơn :)

Trả lời

22

phương pháp Graphics2D.rotate áp dụng chuyển đổi cho tất cả các hoạt động vẽ tiếp theo. Bạn có thể giữ một bản sao của biến đổi (với getTransform()) trước khi áp dụng luân chuyển, và sau đó khôi phục bản gốc.

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

này đã làm việc một cách hoàn hảo !! :) Cảm ơn !! – rafuru

+0

Vì vậy, nó xoay chuỗi nhưng không phải là hệ tọa độ? – qed

+0

Nó sửa đổi hiện tại ['transform'] (http://docs.oracle.com/javase/7/docs/api/java/awt/Graphics2D.html#getTransform()) của ngữ cảnh hiển thị. Tham chiếu ['Graphics2D'] (http://docs.oracle.com/javase/7/docs/api/java/awt/Graphics2D.html) quy định rằng biến đổi được sử dụng để chuyển đổi từ hệ thống tọa độ Không gian Người dùng sang Không gian Thiết bị. Vì vậy, nó xoay hệ tọa độ :) Dòng cuối cùng của ví dụ này là khôi phục lại biến đổi sau khi kết xuất chuỗi. – Mersenne

2

Tôi có một đoạn mã sau đây mà tôi đã thêm vào để bao gồm đối tượng Hình chữ nhật. Tôi có thể thấy văn bản của tôi đang xoay, chứ không phải hình chữ nhật.

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

Có thể bạn có thể thử với điều này.

14

Phương pháp này sẽ xoay văn bản và sẽ hiển thị tất cả các hình dạng khác giống nhau.

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

Điều này tốt hơn (imho) so với giải pháp được chấp nhận. – brimborium

+0

Giải pháp này làm việc hoàn hảo cho tôi – gshauger

8

Mã này tốt hơn và nếu bạn không muốn sử dụng 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); 
}  

Cách sử dụng:

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

Đây phải là câu trả lời được chấp nhận vì nó đơn giản hơn và do đó áp dụng cho một phạm vi rộng hơn các tình huống. +1. – CodeMed

+0

@CodeMed cảm ơn vì sự đánh giá cao của bạn! :) – Danon

Các vấn đề liên quan