2015-11-28 19 views
5

更新済み - 問題は今や醜い方法で解決されていますが、それを行うには適切な方法が必要ですか?フォントがシステムフォントと衝突するとJava JLabelのHTML表示が文字化けする

カスタムフォントのテキストをレンダリングする際に、JLabel のHTML形式で、フォント名がシステムに既にインストールされているフォントの名前と矛盾するときに問題が発生しています

システムフォントは異なる形式(otf対ttf)ですので、当然テキストが文字化けしています。

GraphicsEnvironment.getLocalGraphicsEnvironment().registerFontを呼び出すと、フォントの登録に失敗したことを示すfalseが返されます。だから、私は疑問に思う、登録する前にこのフォントを使用する方法、または登録する前に名前を変更する方法はありますか?

私はttfファイルを編集してフォント名をマングルすることで問題を解決しましたが、矛盾を起こす可能性はほとんどありませんが、この状況を処理する適切な方法があるはずです。

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

上記のコードで使用されるエキソ太字フォントができます - - たとえば、HTTPからダウンロードすること。 com/d/5755/exo.zip? –

+0

私はそのソースを今は思い出しませんが、無料のフォントコレクションからのものでした –

+0

おそらくあなたのフォントファイルを共有できましたか?既定のフォントで同じ問題が発生していますか? –

答えて

1

文字列には、HTMLコマンドにcharsetなどが含まれていることがあります。

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

良い考えですが、そうではありません。それに含まれる唯一のHTMLは '
'です。 (私は ''をサポートしますが、上記の場合はそれがありません)。 –

1

非常に奇妙です。私は私のラップトップ上の例のアプレットを実行すると、出力は罰金だ:

Screenshot with perfectly nice spelled "foo"

私は「エキソBold.ttf」ファイルを使用して、このzip fileを使用しているとJava 8(バージョン1.8.0_65のを使用していますOracle JDK)をWindows 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

テストに感謝します。上記の私の更新を参照してください。 –

+0

Windows 7 x64上のJava 1.8.66。同じフォント(おそらく.otf)をシステムにインストールすると、問題が起こると思いますか? –

+0

フォントファイルに関連する可能性があります。明確にするには:私はフォントをインストールしませんでしたが、アプレットが使用できるようにフォントをダウンロードしました。 –

関連する問題