2013-01-28 9 views
6

अनुक्रम एक JPanel का एक उपवर्ग में मैं यह कर रहा हूं:जावा घुमाया पाठ उलट है पात्रों

public void paintComponent(Graphics g) { 
    super.paintComponent(g); 
    Graphics2D g2d = (Graphics2D)g;   
    g2d.rotate(Math.toRadians(90.)); 
    g2d.drawString(aString, 40, -40); 
} 

पत्र सही ढंग से घुमाया जाता है, लेकिन एक दूसरे के पहले नीचे की उम्मीद स्थिति में नहीं है (करने के लिए अपने दाएं, घुमावदार स्थान में), लेकिन इसके ऊपर (बाईं ओर) है, तीसरा ऊपर (बाईं ओर) दूसरे से ऊपर है। घूर्णन कोण को 45 डिग्री परिणामों में बदलकर प्रत्येक वर्ण में 45 डिग्री सीडब्ल्यू घूर्णन किया जा रहा है, जैसा कि अपेक्षित था, लेकिन वर्णों की पंक्ति 45 डिग्री सेल्सियस घूर्णन की जा रही है, जो दोनों घूर्णन के साथ 90 डिग्री के परिणाम के लिए आधे रास्ते के अनुरूप है।

0 डिग्री रोटेशन पर टेक्स्ट सही ढंग से दिखाई देता है।

मै मैक ओएस एक्स 10.8.2 पर नेटबीन 7.1.2 के साथ विकास कर रहा हूं। विन 7 एसपी 1 पर नेटबीन के समान संस्करण में समस्या नहीं है।

इसका कारण क्या हो सकता है?

+0

ग्राफिक्स कैनवास घुमाया जाता है। आप घूर्णन से पहले drawString को कॉल कर सकते हैं। –

+0

फिर वे सही ढंग से संरेखित नहीं होंगे। –

+0

यह तथ्य कि विंडोज़ में यह काम करता है ओएस एक्स जावा में एक बग का सुझाव देता है। यदि आप Java2D डेमो चलाते हैं और ट्रांसफॉर्म टैब देखते हैं, तो क्या आपको समान समस्याएं दिखाई देती हैं? (जावा 2 डी अलग-अलग डाउनलोड करने योग्य जेडीके "डेमो और नमूने" पैकेज के डेमो/जेएफसी/जावा 2 डी में है, http://www.oracle.com/technetwork/java/javase/downloads/ पर उपलब्ध) – VGR

उत्तर

0

ऐसी 2 चीजें हैं जो मैं अभी देख सकता हूं से काम कर सकती हैं।

पहला स्ट्रिंग को चार सरणी में विभाजित करना होगा, फिर घूर्णन के बाद फ़ॉन्ट आकार (+1 या 2 बोल्ड होने पर) को 1-दर-1 बढ़ाना होगा ताकि वे ऊपर से नीचे जा सकें।

दूसरा तरीका अपना स्वयं का फ़ॉन्ट बनाना होगा, जिसे मैं अनुशंसा नहीं करता। यदि आप घूर्णन से पहले स्ट्रिंग खींचते हैं, तो जब आप सही ढंग से फ़ॉन्ट बनाते हैं तो यह hypothetically घुमाता है, यह इसे प्रदर्शित करना चाहिए।

यदि मैं किसी अन्य तरीके से सोच सकता हूं तो मैं इसे पोस्ट करूंगा।

संपादित करें:

final AffineTransform at = new AffineTransform(); 
final Font font = g.getFont(); 
// Derive a new font using a rotatation transform (Theta is angle in radians). 
at.rotate(theta); 
final Font newFont = font.deriveFont(at); 
// set the derived font in the Graphics2D context 
g2d.setFont(newFont); 

// Render a label instance of type String using the derived font 
g2d.drawString(label, x, y); 

तो, खड़ी आकर्षित करने के लिए है कि 270 डिग्री के एक घुमाने, या 3/2 * pi

+0

दोनों दिलचस्प समाधान हैं लक्षण को ठीक करने के लिए, लेकिन मैं अभी भी सोच रहा हूं कि कोई कारण कारण की पहचान कर सकता है। – eclux

+0

क्योंकि यदि आप ग्राफिक्स को घुमाते हैं, तो यह नहीं बदलेगा जो प्रस्तुत नहीं किया गया है। यदि आप पहले स्ट्रिंग को घुमाते हैं (जिसे आप देखना चाहते हैं), तो यह पठनीय नहीं होगा। –

1

हम एक ही बात को देख रहे हैं होगा। हमारे पास कोड है जो अधिकांश जेआरई 6 और 7 संस्करणों में फैले विंडोज़ पर बहुत अच्छा काम करता है। उसी कोड ने आज घुमावदार पिछड़े वर्णों की समस्या का प्रदर्शन किया। ओएस एक्स पर समस्या जेआरई संस्करण 1.6.0_37 है। यह ओएस एक्स पर पहले से काम कर सकता है या नहीं। 99.9% हमारे उपयोगकर्ता विंडोज पर हैं।

एक वर्कअराउंड टेक्स्ट को BufferedImage में प्रस्तुत करना होगा और फिर छवि को घुमाएं। यह एक तरीका है जिसका उपयोग मैंने पाठ को 20-30 डिग्री या उससे घूर्णन के लिए दृष्टि से बेहतर परिणाम प्राप्त करने के लिए किया है।

2

मैं इस समस्या के लिए एक अजीब समाधान (कि बग की विचित्रता से मेल खाता है)

FontRenderContext frc = new FontRenderContext(g2.getTransform(), true, true); 

g2.drawGlyphVector(currentFont.createGlyphVector(frc, aString), textX, textY); 

किसी कारण FontRenderContext पर सच करने के लिए विरोधी aliasing की स्थापना इसे सही ढंग से कार्य करने के लिए कारण होगा के लिए मिल गया है। ऐसा लगता है कि किसी को रेंडर कोड में कहीं भी एक ऋण चिह्न गुम है, या जिस स्पेक के लिए वे लिख रहे थे उसे गलत समझा!

1

उपयोगकर्ता1181445 द्वारा पोस्ट की गई AffineTransformation की विधि मेरे लिए सबसे हालिया जावा ओएसएक्स अपडेट (संस्करण 7, अद्यतन 55) तक समस्याग्रस्त ओएसएक्स समेत सभी प्लेटफार्मों के लिए काम कर रही थी। अब घुमावदार पाठ गड़बड़ है, लेकिन केवल एप्लेट पर। मुझे हमारे ऐप के स्टैंडअलोन संस्करण में कोई समस्या नहीं दिख रही है।

1

ओएस एक्स 10.10 बनाम विंडोज 7 पर, मुझे बिल्कुल वही समस्या मिली है, लेकिन विपरीत में! अर्थात।ऊर्ध्वाधर पाठ को चित्रित करने से पहले पूरे ग्राफिक्स संदर्भ को घूर्णन करना ठीक दिखता है, लेकिन एक नए फ़ॉन्ट पर एफ़िनट्रांसफॉर्म लागू करने से अजीब घुमावदार पाठ उत्पन्न होता है।

मुझे लगता है कि थोड़ा अधिक सिर्फ पाठ को घुमाने के लिए कुशल तो एक व्यावहारिक है, अगर असजीला समाधान मंच पहले जाँच करने के लिए है:

Font font = g.getFont(); 
    if (System.getProperty("os.name").startsWith("Mac")) { 
     g.rotate(-Math.PI/2, x, y); 
     g.drawString(string, x, y); 
     g.rotate(Math.PI/2, x, y);     
    } else { 
     AffineTransform fontAT = new AffineTransform();     
     fontAT.rotate(-Math.PI/2); 
     g.setFont(font.deriveFont(fontAT)); 
     g.drawString(string, x, y); 
     g.setFont(font); 
    } 
संबंधित मुद्दे