2011-09-01 5 views
10

私はSwingアプリケーションをOS XからWindowsに移植し始めました。状況はJLabelで苦しいです。JLabel htmlテキストはsetFontを無視します

setFontに指定されたフォントは、ラベルのテキストがHTMLの場合は無視されます(これはMacでは発生しません)。 HTMLフォーマットは、複雑なディスプレイでの読み易さには非常に便利です。

通常の状況では、HTMLタグにフォントを指定しますが、使用しているフォントは実行時にFont.createFontを使ってJARのttfを使ってロードされます。私はフォントタグで読み込まれたフォントの名前を使用しようとしましたが、うまくいきませんでした。

ロードされたawt.Fontをhtml-ifiedで使用する方法はありますか?WindowsのJLabel

例を示します。私は自分のアプリケーションのフォントを共有することはできませんが、私はこの1つだけ(純粋TTF)と同じ動作でそれを実行しましたが起こる:

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();} 
         } 
       }); 
     } 

} 

EDIT:興味深いことに、Iのいずれかを使用している場合JREのlib/fontsフォルダ(ここではLucidaフォントの1つをtest_java.ttfに改名したもの)からのttfです。このスニペットはブール値onとoffで同じ結果を生成します。

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();} 
     } 
    }); 
} 

EDIT 2:JLabelのフォントのデフォルトを設定するために、ここで説明する方法はまったく同じ問題を抱えている(平文が罰金を示し、html'dテキストはしていません):Changing default JLabel font

EDIT 3:私はしましたdafontのランダムなフォントでさえ、システムにインストールされていればうまく動作することに気がつきました(ファイルから[今インストールされている] ttfのコピーをロードしているこの正確なコードでも)。

+0

[sscce](http://www.sscce.org)を含めることは可能でしょうか?その間に、[Swing ComponentsでHTMLを使用する方法](http://download.oracle.com/javase/tutorial/uiswing/components/html.html)のチュートリアルを読んでください。 – mre

+0

'Font.createFont'に問題がある可能性が高いです。'Jlabel'の' setFont() 'はフォントを設定することが保証されています - @mreの示唆しているように、この例はこれをより良く答えるのに役立ちます。 –

+0

JLabelのsetText( "example")に読み込まれたフォントが表示されますが、setText( " example")の場合、デフォルトのSwing JLabelフォントが使用されるため、Font.createFontが機能することがわかります。これはsscceとしてカウントされますか? –

答えて

12

の表示がありますregisterFont()

実行時に.ttfをJREにコピーできたら、この小さな宝石が見つかりました。それはまさにそれが想定していることをします。あなたは、実行時にフォントをロードするためにFont.createFontを使用している場合は、単に実行します。

GraphicsEnvironment.getLocalGraphicsEnvironment().registerFont(myCreatedFont)

はJREに登録します。

これにより、フォントはHTMLのテキストとWindowsのプレーンテキストに表示されます!

+0

+1 ['createFont ) '](http://download.oracle.com/javase/6/docs/api/java/awt/Font.html#createFont%28int,%20java.io.InputStream%29)にはこれが記載されていますが、少しです曖昧。 – trashgod

+0

Java 6のjavadocでのみ記述されています。 1.4のjavadocを最初に見せてくれるのはあなたのGoogleです! –

+0

Snoracle ShuffleのためにGoogleを責めることはできません! :-) – trashgod

4

参考のために、ここで比較して、MAC OS Xの

enter image description here

に見られるものだが、ここではUbuntuの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

ええ、OS Xは期待通りに動作します。 –

+0

私は、簡単な並列比較が光を放つかもしれないことを望んでいました。 _any_ '.ttf'ファイルはWindows上で動作しますか? – trashgod

+0

ええ、組み込み(すでにJREがインストールされている)Lucida ttfは私のために正しいことをします。 Linuxもあなたのために壊れているようです(Sun JavaまたはOpenJDKですか?)。 –

関連する問題