2015-11-28 8 views
5

अद्यतन - समस्या अब बदसूरत तरीके से हल हो गई है - लेकिन ऐसा करने का एक उचित तरीका होना चाहिए?जावा जेएलएबल एचटीएमएल डिस्प्ले खराब हो जाता है जब फ़ॉन्ट सिस्टम सिस्टम के साथ संघर्ष करता है

मुझे एक कस्टम फ़ॉन्ट में टेक्स्ट को प्रतिपादित करने में समस्याएं आ रही हैं, एचटीएमएल में जेएलएबल में जब फ़ॉन्ट नाम सिस्टम पर पहले से स्थापित फ़ॉन्ट के नाम से संघर्ष करता है।

सिस्टम फ़ॉन्ट एक अलग प्रारूप (ओटीएफ बनाम टीटीएफ) में है, इसलिए आश्चर्यजनक रूप से टेक्स्ट खराब हो गया है।

GraphicsEnvironment.getLocalGraphicsEnvironment().registerFont पर कॉल करने के लिए फ़ॉन्ट को पंजीकृत करने में विफल होने के लिए झूठा रिटर्न देता है। तो मुझे लगता है कि सवाल यह है कि पंजीकरण के बिना इस फ़ॉन्ट का उपयोग करने का कोई तरीका है, या पंजीकरण करने से पहले इसका नाम बदलने का कोई तरीका है?

मैंने अब टीटीएफ फ़ाइल को संपादित करके और फ़ॉन्ट नाम को मैंगलिंग करके मेरी समस्या हल कर दी है ताकि संघर्ष बहुत ही असंभव हो सके, लेकिन मुझे लगता है कि इस स्थिति को संभालने का एक उचित तरीका होना चाहिए।

package test; 

import java.awt.BorderLayout; 
import java.awt.Container; 
import java.awt.Font; 
import java.awt.FontFormatException; 
import java.awt.GraphicsEnvironment; 
import java.io.IOException; 
import java.io.InputStream; 
import javax.swing.JApplet; 
import javax.swing.JComponent; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 

@SuppressWarnings("serial") 
class MyComponent extends JPanel { 
    Font font; String text; 
    public MyComponent(Font f) {font=f;} 
    public void initSwing() 
    { 
     final String labelcontents = "<html><center>foo</center></html>"; 
     System.out.println(labelcontents); 
     JLabel text = new JLabel(labelcontents); 
     text.setFont(font); 
     add(text,BorderLayout.CENTER); 
    } 
} 

@SuppressWarnings("serial") 
public class TestApplet extends JApplet { 
     public void init() 
     { 
      Font mainFont = null; 
      InputStream is = getClass().getResourceAsStream("fonts/Exo-Bold.ttf"); 
      try { 
       mainFont = Font.createFont(Font.TRUETYPE_FONT, is).deriveFont(24f); 
       System.out.println(mainFont.getName()); 
       boolean registered=GraphicsEnvironment.getLocalGraphicsEnvironment().registerFont(mainFont); 
       System.out.println("registered "+registered); 
      } catch (FontFormatException e1) { 
       e1.printStackTrace(); 
      } catch (IOException e1) { 
       e1.printStackTrace(); 
      } 

      final Container fframe = (JComponent)(getContentPane()); 
      final MyComponent component = new MyComponent(mainFont); 

      Thread t = new Thread(new Runnable() { 
       public void run() { try { 

        SwingUtilities.invokeAndWait(new Runnable() {public void run() { 
         fframe.add(component); 
         component.initSwing(); 
         fframe.revalidate(); 
         fframe.repaint(); 
        }}); 

       } catch (Exception e) { 
        e.printStackTrace(); 
       } } 
      }); 
      t.start(); 
     } 
} 
+0

कि उपरोक्त कोड में प्रयोग किया जाता है Exo-बोल्ड फ़ॉन्ट कर सकते हैं - - उदाहरण के लिए से http डाउनलोड किया जा। कॉम/घ/5755/exo.zip? –

+0

मुझे अब इसके स्रोत को याद नहीं है लेकिन यह एक मुफ्त फ़ॉन्ट संग्रह –

+0

से था शायद आप अपनी फ़ॉन्ट फ़ाइल साझा कर सकते हैं? क्या आप एक डिफ़ॉल्ट फ़ॉन्ट के लिए एक ही समस्या देखते हैं? –

उत्तर

1

हो सकता है कि पाठ में वर्णमाला के साथ HTML कमांड हों।

String text1 = "<html><body>" 
    + text.replace("&", "&amp;") 
      .replace("<", "&lt;") 
      .replace(">", "&gt;"); 
    + "</body></html>"; 
+0

अच्छा विचार लेकिन यह नहीं करता है। इसमें केवल एक ही HTML है जो '
' है। (मैं इसे '' का समर्थन करना चाहता हूं लेकिन ऊपर दिए गए मामले में यह नहीं है)। –

1

बहुत अजीब। जब मैं अपने लैपटॉप पर अपने उदाहरण एप्लेट चलाने के लिए, उत्पादन ठीक लग रहा है:

Screenshot with perfectly nice spelled "foo"

मैं इस zip file "Exo-Bold.ttf" फ़ाइल के साथ इस्तेमाल किया है और जावा 8 (की 1.8.0_65 संस्करण का उपयोग कर रहा ओरेकल जेडीके) विंडोज 8.1 पर।

यह वह जगह है कि मैं भाग गया अपने कोड की रूपांतरित संस्करण: //www.1001freefonts:

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

@SuppressWarnings("serial") 
class MyComponent extends JPanel { 
    Font font; String text; 
    public MyComponent(Font f) {font=f;} 
    public void initSwing() 
    { 
     final String labelcontents = "<html><center>foo</center></html>"; 
     System.out.println(labelcontents); 
     JLabel text = new JLabel(labelcontents); 
     text.setFont(font); 
     add(text,BorderLayout.CENTER); 
    } 
} 

@SuppressWarnings("serial") 
public class TestApplet extends JApplet { 
    public void init() 
    { 
     Font mainFont = null; 

     try { 
      //InputStream is = getClass().getResourceAsStream("fonts/Exo-Bold.ttf"); 
      InputStream is = new FileInputStream("C:/Freek/[...]/Exo-Bold.ttf"); 
      mainFont = Font.createFont(Font.TRUETYPE_FONT, is) 
          .deriveFont(Font.BOLD, 24f); 
      is.close(); 
      System.out.println(mainFont.getName()); 
      boolean result = GraphicsEnvironment.getLocalGraphicsEnvironment() 
               .registerFont(mainFont); 
      System.out.println("Result registerFont: " + result); 
     } catch (FontFormatException e1) { 
      e1.printStackTrace(); 
     } catch (IOException e1) { 
      e1.printStackTrace(); 
     } 

     final Container fframe = (JComponent)(getContentPane()); 
     final MyComponent component = new MyComponent(mainFont); 

     Thread t = new Thread(new Runnable() { 
      public void run() { try { 

       SwingUtilities.invokeAndWait(new Runnable() {public void run() { 
        fframe.add(component); 
        component.initSwing(); 
        fframe.revalidate(); 
        fframe.repaint(); 
       }}); 

      } catch (Exception e) { 
       e.printStackTrace(); 
      } } 
     }); 
     t.start(); 
    } 
} 
+0

परीक्षण के लिए धन्यवाद। ऊपर मेरा अपडेट देखें। विंडोज 7 x64 पर –

+0

जावा 1.8.66। सिस्टम पर एक ही फ़ॉन्ट (संभवतः .otf) स्थापित करना होगा क्योंकि समस्या आपको लगता है? –

+0

यह फ़ॉन्ट फ़ाइल से संबंधित हो सकता है। स्पष्ट होने के लिए: मैंने फ़ॉन्ट इंस्टॉल नहीं किया है, लेकिन इसे डाउनलोड किया है ताकि एप्लेट इसका उपयोग कर सके। –

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