2011-08-18 22 views
15
Font font = Font("Arial", Font.BOLD, 35); 

JLabel label = new JLabel("57"); 
JPanel panel = new JPanel(); 
panel.setLayout(new BoxLayout(panel, BoxLayout.LINE_AXIS)); 
panel.add(label); 

यह ऊपर और नीचे एक अतिरिक्त स्थान के साथ एक जेएलएबल बनाता है। मैंने setVerticalAlignment(SwingConstants.TOP) की कोशिश की लेकिन यह काम नहीं कर रहा है। दोबारा, मैं जेएलएबल को शीर्ष पर संरेखित नहीं करना चाहता हूं लेकिन जेएलएबल के अंदर का पाठ शीर्ष पर गठबंधन होना चाहिए।जेएलएबल वर्टिकल संरेखण अपेक्षित काम नहीं कर रहा है

यहाँ

कि मेरे लेबल, ग्लिफ़ के नाममात्र चढ़ाई और अधिकतम चढ़ाई के बीच अंतर करने के लिए अपने आरेख अंक में तरह enter image description here

+0

एक पंक्ति भूल गई। label.setFont (फ़ॉन्ट); – arpanoid

+0

इसके लिए संभावित कारण यह है कि कुछ प्रतीकों संख्याओं से ऊपर की ओर बढ़ेगा, और लेबल के आकार के साथ लेबल के भीतर टेक्स्ट संरेखण, खाते में एकाधिक फ़ॉन्ट मीट्रिक लेना चाहिए। http://upload.wikimedia.org/wikipedia/commons/3/39/Typography_Line_Terms.svg आपके प्रश्न का उत्तर नहीं है, लेकिन यह मदद कर सकता है। एक तस्वीर सहित –

+0

+1; एक तरफ के रूप में, ['रेंडरिंग हिंट्स]] (http://download.oracle.com/javase/6/docs/api/java/awt/RenderingHints.html) के मान को नजरअंदाज न करें। – trashgod

उत्तर

19

आपके लेबल में टेक्स्ट वास्तव में पहले से ही शीर्ष पर गठबंधन है। आप सभी तीन सेट तक कि यदि:

label.setVerticalAlignment(JLabel.TOP); 
label.setVerticalTextPosition(JLabel.TOP); 
panel.setAlignmentY(TOP_ALIGNMENT); 

आप अभी भी उस खाई को पाते हैं।

समस्या फ़ॉन्ट-मेट्रिक्स से संबंधित है। फ़ॉन्ट डायक्रिटिक्स के लिए जगह छोड़ देता है, और अंग्रेजी संख्याओं और यहां तक ​​कि अक्षरों में पूंजी अक्षरों पर विशिष्टता नहीं होती है, जबकि एरियल में निश्चित रूप से अंतर्राष्ट्रीय पात्रों की एक पूर्ण चौड़ाई होती है जिसमें पूंजी पत्र से अधिक लम्बे होते हैं, उदाहरण के लिए, जर्मन umlauts (ÄÖÜ) या वर्ण पुर्तगाली diacritics (एएए) युक्त।

यदि आप एक त्वरित, आसान समाधान चाहते हैं जो एक हैक है, जो फोंट और प्लेटफॉर्म पर अच्छी तरह से स्केल नहीं कर सकता है, तो आप फ़ॉन्ट मीट्रिक की क्षतिपूर्ति के लिए सीमा पर नकारात्मक मान का उपयोग कर सकते हैं।

label.setBorder(BorderFactory.createEmptyBorder(-3 /*top*/, 0, 0, 0)); 

आप इसे ठीक करने के लिए चाहते हैं "सही" आप FontMetrics पैकेज के बारे में सीखने में, के रूप में यह कई कार्यों है कि पाठ की वास्तविक ऊंचाई स्थान की गणना के लिए उपयोगी हो सकता है देखना चाहिए प्रदर्शित किया जा रहा है, इस तरह कि आप पूरी स्ट्रिंग को उचित पिक्सल से स्थानांतरित कर सकते हैं।

+0

+1 क्या आप इस कामकाज की सापेक्ष सुरक्षा पर टिप्पणी कर सकते हैं? – trashgod

+0

+1, अच्छा हैक। मुझे पता नहीं था कि आप नकारात्मक मूल्यों का उपयोग कर सकते हैं। : डी – mre

+0

धन्यवाद .. यह काम किया था। हालांकि मैसी ....... – arpanoid

5

तीर लग रहा है के रूप में FontMetrics में चर्चा की है। आप setBorder(null) के साथ टिंकर कर सकते हैं; लेकिन पूर्ण नियंत्रण के लिए, आपको here दिखाए गए अनुसार, आपको ग्लिफ स्वयं प्रस्तुत करना होगा। सौभाग्य से, अधिकांश फोंट के अंकों के ग्लिफ में एक समान अग्रिम और चढ़ाई है।

+2

भले ही आप \t 'फ़ॉन्टमैट्रिक्स फ़ॉन्ट मेट्रिक्स = label.getFontMetrics (फ़ॉन्ट); int ऑफसेट = fontMetrics.getMaxAscent() - fontMetrics.getAscent(); System.out.println (ऑफसेट); 'एरियल में फ़ॉन्ट सेट के साथ अपने नमूना कोड का उपयोग करके, आपको शून्य का अंतर मिलेगा। यह वास्तव में एक ज्ञात बग है (http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6623223) जो संभवतः तय नहीं होगा क्योंकि यह पिछड़ा संगतता तोड़ता है और इस तरह की कम प्राथमिकता के साथ चिह्नित किया जाता है। –

+0

अच्छा संदर्भ, धन्यवाद! अपडेट किया गया। – trashgod

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