我剛剛開始將我的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的副本)也可以工作。
您可能包含[sscce](http://www.sscce.org)嗎?同時,如果您尚未閱讀[如何在Swing組件中使用HTML](http://download.oracle.com/javase/tutorial/uiswing/components/html.html)教程。 – mre
這很可能是你'Font.createFont'有問題。'Jlabel'的'setFont()'保證設置字體 - 正如@mre所示,這個例子有助於更好地回答這個問題。 –
我知道Font.createFont的工作原理是因爲如果我在JLabel上設置了文本(「示例」),則加載的字體顯示出來,但是如果我設置了文本(「示例」),則使用默認的Swing JLabel字體。這是否算作sscce? –