2012-04-10 15 views
12

BenJava'da Graphics2D ile metin nasıl döndürülebilir?

Benim kod budur .. Graphics2D kullanarak Jpanel metni döndürmek istiyorum: Bu yöntem bir dikdörtgen ve dikdörtgen üzerine bir metin çizmek gerekir, ancak

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) 

i tüm bu yöntemi çalıştırdığınızda ..

Teşekkür :)

cevap

22

yöntem Graphics2D.rotate sonraki tüm render işlemlerine dönüşümü uygular grafik döndürülür ve ben sadece metnini döndürmek istiyorum. Döndürmeden önce dönüşümün bir kopyasını (getTransform() ile) koruyabilir ve sonra orijinali geri yükleyebilirsiniz.

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

Bu mükemmel çalıştı !! :) Teşekkürler !! – rafuru

+0

Yani dizeyi döndürür, ancak koordinat sistemini değil? – qed

+0

Oluşturma bağlamının geçerli ['dönüşümü '' (http://docs.oracle.com/javase/7/docs/api/java/awt/Graphics2D.html#getTransform()) değiştirir. ['Graphics2D'] (http://docs.oracle.com/javase/7/docs/api/java/awt/Graphics2D.html) referansı, dönüşümün Kullanıcı Alanı koordinat sisteminden Cihaz Alanına dönüştürülmesinde kullanıldığını belirtir. Yani, koordinat sistemini döndürür :) Bu örnekteki son satır, dizgi oluşturulduktan sonra dönüşümü geri yüklemektir. – Mersenne

2

I Rectangle nesnesi içerir ilave ki, aşağıdaki ile bir kod parçası vardır. Metnimin döndüğünü görüyorum, dikdörtgeni değil.

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

bu ile deneyebilirsiniz olabilir.

14

Bu yöntem metni döndürür ve diğer tüm şekilleri aynı hale getirir.

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

Bu kabul edilen çözümden daha iyidir (imho). – brimborium

+0

Bu çözüm benim için mükemmel bir şekilde çalıştı – gshauger

8

Bu kod daha iyi olduğunu ve AffineTransform kullanmak istemiyorsanız.

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

Kullanımı:

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

Bu kabul edilen cevap olmalı, çünkü daha basittir ve bu nedenle daha geniş bir aralıktaki durumlar için geçerlidir. +1. – CodeMed

+0

@CodeMed Takdiriniz için teşekkür ederiz! :) – Danon

İlgili konular