2011-09-01 24 views
10

मैंने ओएस एक्स से विंडोज़ में अपने स्विंग ऐप को पोर्ट करना शुरू कर दिया है और JLabel एस के साथ चीजें दर्दनाक हैं।जेएलएबल एचटीएमएल टेक्स्ट सेट अनदेखा करता है

मैंने देखा है कि setFont पर निर्दिष्ट फ़ॉन्ट को अनदेखा किया गया है यदि लेबल का टेक्स्ट HTML है (यह मैक पर नहीं होता है)। एचटीएमएल स्वरूपण जटिल प्रदर्शनों पर पठनीयता के लिए बेहद उपयोगी है।

सामान्य परिस्थितियों में मैं एक HTML टैग में फ़ॉन्ट निर्दिष्ट करता हूं, लेकिन जिस फ़ॉन्ट का मैं उपयोग कर रहा हूं उसे Font.createFont का उपयोग कर जेआर के बाहर एक टीटीएफ के साथ रनटाइम पर लोड किया जाता है। मैंने फ़ॉन्ट टैग में लोड किए गए फ़ॉन्ट का नाम उपयोग करने का प्रयास किया, लेकिन यह काम नहीं किया।

क्या कोई तरीका है कि मैं लोड किए गए awt.Font का उपयोग विंडोज पर एक HTML- ified JLabel के साथ कर सकता हूं?

यहां एक उदाहरण है। मैं अपने आवेदन के फ़ॉन्ट साझा नहीं कर सकते, लेकिन मैं तो बस इस एक (एक शुद्ध टीटीएफ) और एक ही व्यवहार के साथ यह भाग गया होता है:

http://www.dafont.com/sophomore-yearbook.font

import java.awt.Font; 
import java.io.File; 
import javax.swing.*; 

public class LabelTestFrame extends JFrame { 

     public LabelTestFrame() throws Exception { 
       boolean useHtml = true; 
       String fontPath = "C:\\test\\test_font.ttf"; 
       JLabel testLabel = new JLabel(); 
       Font testFont = Font.createFont(Font.TRUETYPE_FONT, new File(fontPath)).deriveFont(18f); 
       testLabel.setFont(testFont); 
       if (useHtml) testLabel.setText("<html>Some HTML'd text</html>"); 
       else testLabel.setText("Some plaintext"); 
       getContentPane().add(testLabel); 
       setSize(300,300); 
     } 

     public static void main(String[] args) { 
       SwingUtilities.invokeLater(new Runnable() { 
         @Override 
         public void run() { 
           try {new LabelTestFrame().setVisible(true);} 
           catch (Exception e) {e.printStackTrace();} 
         } 
       }); 
     } 

} 

संपादित करें: काफी दिलचस्प है, अगर मैं किसी एक का उपयोग जेआरई के जेआरई के लिब/फोंट फ़ोल्डर से टीटीएफ (इस मामले में लुसीडा फ़ॉन्ट्स में से एक का नाम बदलकर test_java.ttf में बदल दिया गया है) यह स्निपेट बूलियन के साथ समान परिणाम उत्पन्न करता है।

public LabelTestFrame() throws Exception { 
    boolean useHtml = false; 
    String fontPath = "C:\\test\\test_java.ttf"; 
    JLabel testLabel = new JLabel(); 
    Font testFont = Font.createFont(Font.TRUETYPE_FONT, new File(fontPath)).deriveFont(18f); 
    testLabel.setFont(testFont); 
    if (useHtml) testLabel.setText("<html><b>Some HTML'd text</b></html>"); 
    else testLabel.setText("Some plaintext"); 
    getContentPane().add(testLabel); 
    setSize(300,300); 
} 

public static void main(String[] args) { 
    SwingUtilities.invokeLater(new Runnable() { 
     @Override 
     public void run() { 
      try {new LabelTestFrame().setVisible(true);} 
      catch (Exception e) {e.printStackTrace();} 
     } 
    }); 
} 

संपादित करें 2: विधि यहाँ डिफ़ॉल्ट सेटिंग JLabel फ़ॉन्ट के लिए वर्णित बिल्कुल एक ही समस्या है (प्लेन टेक्स्ट ठीक पता चलता है, html'd पाठ नहीं करता है): Changing default JLabel font

संपादित करें 3: मैंने ध्यान दिया गया है कि डाफॉन्ट से भी यादृच्छिक फोंट काम करेंगे अगर वे सिस्टम पर स्थापित हैं (यहां तक ​​कि इस सटीक कोड के साथ, जहां मैं एक फ़ाइल से [अब स्थापित] ttf की प्रतिलिपि लोड कर रहा हूं)।

+0

क्या आपके लिए एक [एसएससीईएस] (http://www.sscce.org) शामिल करना संभव होगा? इस बीच, यदि आपने पहले से नहीं किया है, [स्विंग घटक में HTML का उपयोग कैसे करें] (http://download.oracle.com/javase/tutorial/uiswing/components/html.html) ट्यूटोरियल पढ़ें। – mre

+0

यह अत्यधिक संभावना है कि आप 'font.createFont' में समस्याएं हैं।'Jlabel' के' setFont() 'फ़ॉन्ट स्थापित करने के लिए गारंटी है - के रूप में @mre पता चलता है, उदाहरण के इस बेहतर जवाब देने के लिए मदद मिलेगी। –

+0

मुझे पता है कि Font.createFont काम करता है क्योंकि अगर मैं JLabel पर setText ("उदाहरण") लोड फ़ॉन्ट दिखाता है, लेकिन अगर मैं setText (" उदाहरण") डिफ़ॉल्ट स्विंग JLabel फ़ॉन्ट प्रयोग किया जाता है। क्या यह एक एसएससी के रूप में गिना जाता है? स्पष्टीकरण के लिए –

उत्तर

12

है registerFont()

मुझे यह छोटा मणि मिला, जबकि मैं .ttf को रनटाइम पर जेआरई में कॉपी कर सकता था। यह वही करता है जो इसे माना जाता है। आप Font.createFont का उपयोग करते हैं क्रम में एक फ़ॉन्ट लोड करने के लिए, बस कार्य करें:

GraphicsEnvironment.getLocalGraphicsEnvironment().registerFont(myCreatedFont)

JRE के साथ रजिस्टर करने के लिए।

यह फ़ॉन्ट को HTML'd टेक्स्ट के साथ-साथ विंडोज पर सादे टेक्स्ट में दिखाने की अनुमति देता है!

+0

+1 ['createFont () '] (http://download.oracle.com/javase/6/docs/api/java/awt/Font.html#createFont%28int,%20java.io.InputStream%29) इसका उल्लेख करता है, लेकिन यह थोड़ा सा है अस्पष्ट। – trashgod

+0

यह केवल जावा 6 जावाडोक में इसका उल्लेख करता है। पहले आप 1.4 के जावाडोक दिखाने के लिए Google को डरते हैं! –

+0

Snoracle फेरबदल के लिए गूगल को दोष नहीं दे सकते हैं! :-) – trashgod

4

संदर्भ के लिए, क्या मैक ओएस एक्स पर देखा जाता है

enter image description here

तुलना करके, यहाँ उबंटू 10 पर प्रदर्शन है, OpenJDK 6.

enter image description here

import java.awt.Font; 
import java.awt.GridLayout; 
import java.io.File; 
import javax.swing.*; 

public class LabelTestFrame extends JFrame { 

    public LabelTestFrame() throws Exception { 
     this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     this.setLayout(new GridLayout(0, 1)); 
     String fontPath = "SophomoreYearbook.ttf"; 
     Font testFont = Font.createFont(
      Font.TRUETYPE_FONT, new File(fontPath)).deriveFont(18f); 
     JLabel label1 = new JLabel("<html>Some HTML'd text</html>"); 
     label1.setFont(testFont); 
     this.add(label1); 
     JLabel label2 = new JLabel("Some plaintext"); 
     this.add(label2); 
     this.pack(); 
     this.setLocationRelativeTo(null); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       try { 
        new LabelTestFrame().setVisible(true); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 
    } 
} 
+0

हाँ, ओएस एक्स मेरे लिए अपेक्षित काम करता है। –

+0

मैं उम्मीद कर रहा था कि एक आसान साइड-बाय-साइड तुलना प्रकाश को छोड़ सकती है। क्या _any_ '.ttf' फ़ाइल विंडोज पर काम करती है? – trashgod

+0

हाँ, निर्मित (पहले से स्थापित JRE) ल्युसिडा ttf मेरे लिए सही काम करता है। ऐसा लगता है कि लिनक्स आपके लिए भी टूट रहा है (क्या यह सूर्य जावा या ओपनजेडीके है?)। –

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