2011-09-01 77 views
10

我剛剛開始將我的Swing應用程序從OS X移植到Windows,並且事情與JLabel s是痛苦的。JLabel HTML文本忽略setFont

我注意到,如果標籤的文本是HTML(這在Mac上不會發生),則指定爲setFont的字體將被忽略。 HTML格式對複雜顯示器的可讀性非常有用。

在正常情況下,我會在HTML標記中指定字體,但是我使用的字體在運行時使用Font.createFont加載,並且ttf不在JAR中。我嘗試在字體標籤中使用加載的字體的名稱,但沒有奏效。

有沒有什麼辦法可以在Windows上使用加載的awt.Font和html-ified JLabel

下面是一個例子。我不能分享我的應用程序的字體,但我只是用這一個(純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();} 
         } 
       }); 
     } 

} 

編輯:有趣的是,如果我使用的一個ttf從JRE的lib/fonts文件夾中(在這種情況下,其中一個Lucida字體在這裏重命名爲test_java.ttf),這個片段產生與boolean 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();} 
     } 
    }); 
} 

編輯2:這裏所描述的設置默認的JLabel字體的方法有完全相同的問題(明文顯示精細,html'd文本不):Changing default JLabel font

編輯3:我注意到即使是在系統上安裝了dafont的隨機字體(即使使用這個確切的代碼,我從文件中加載了[現在安裝的] ttf的副本)也可以工作。

+0

您可能包含[sscce](http://www.sscce.org)嗎?同時,如果您尚未閱讀[如何在Swing組件中使用HTML](http://download.oracle.com/javase/tutorial/uiswing/components/html.html)教程。 – mre

+0

這很可能是你'Font.createFont'有問題。'Jlabel'的'setFont()'保證設置字體 - 正如@mre所示,這個例子有助於更好地回答這個問題。 –

+0

我知道Font.createFont的工作原理是因爲如果我在JLabel上設置了文本(「示例」),則加載的字體顯示出來,但是如果我設置了文本(「示例」),則使用默認的Swing JLabel字體。這是否算作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! –

+0

不能責怪谷歌的Snoracle Shuffle! :-) – 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?)。 –