2012-04-10 14 views
12

मैं एक JPanel Graphics2D के प्रयोग पर पाठ घुमाना चाहते ..जावा में ग्राफिक्स 2 डी के साथ पाठ को घुमाने के लिए कैसे?

मेरे कोड यह है:

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

+0

तो यह स्ट्रिंग को घुमाता है लेकिन समन्वय प्रणाली नहीं है? – qed

+0

संदर्भ प्रस्तुत करने के वर्तमान ['transform'] (http://docs.oracle.com/javase/7/docs/api/java/awt/Graphics2D.html#getTransform()) को संशोधित करता है। ['ग्राफिक्स 2 डी'] (http://docs.oracle.com/javase/7/docs/api/java/awt/Graphics2D.html) संदर्भ बताता है कि ट्रांसफॉर्म का उपयोग उपयोगकर्ता स्पेस समन्वय प्रणाली से डिवाइस स्पेस में कनवर्ट करने के लिए किया जाता है। तो, यह समन्वय प्रणाली घुमाता है :) इस उदाहरण की अंतिम पंक्ति स्ट्रिंग प्रतिपादन के बाद परिवर्तन बहाल कर रहा है। – Mersenne

2

मेरे पास निम्नलिखित के साथ कोड का एक टुकड़ा है जिसमें मैंने आयत वस्तु शामिल करने के लिए जोड़ा है। मैं देख सकता हूं कि मेरा पाठ घुमावदार है, न कि आयताकार।

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

+0

यह समाधान मेरे लिए पूरी तरह से काम करता है – gshauger

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

+0

@CodeMed आपकी प्रशंसा के लिए धन्यवाद! :) – Danon

संबंधित मुद्दे