JLabel html текст игнорирует setFont
Я только начал портировать свое приложение Swing из OS X в Windows, и все становится больно с JLabel
s.
Я заметил, что шрифт, указанный в setFont
, игнорируется, если текст ярлыка является HTML (этого не происходит на Mac). Форматирование HTML Чрезвычайно полезно для удобства чтения на сложных дисплеях.
В нормальных условиях я бы указал шрифт в теге HTML, но используемый шрифт загружается во время выполнения с помощью Font.createFont
с ttf из JAR. Я попытался использовать загруженное имя шрифта в теге шрифта, но это не сработало.
Можно ли использовать загруженный awt.Font
с html-ified JLabel
в Windows?
Вот пример. Я не могу поделиться своим шрифтом приложения, но я просто запускал его с этим (чистый 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: достаточно интересно, если я использую один из ttf из папки JRE lib/fonts (в этом случае один из шрифтов Lucida, переименованный в test_java.ttf), этот фрагмент воспроизводит идентичные результаты с булевым включением и выключением.
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 по умолчанию, имеет точно такую же проблему (plaintext показывает fine, html'd текст не указан): Изменение шрифта по умолчанию JLabel
ИЗМЕНИТЬ 3: Я заметил, что даже случайные шрифты из dafont будут работать, если они установлены в системе (даже с этим точным кодом, где я загружаю копию [now installed] ttf из файла).
Ответы
Ответ 1
registerFont()
Я нашел эту маленькую жемчужину, в то время как Googling о том, могу ли я скопировать .ttf
в JRE во время выполнения. Он делает то, что должен. Если вы используете Font.createFont
для загрузки шрифта во время выполнения, просто выполните:
GraphicsEnvironment.getLocalGraphicsEnvironment().registerFont(myCreatedFont)
чтобы зарегистрировать его в JRE.
Это позволяет шрифту отображаться в тексте HTML'd, а также в обычном тексте в Windows!
Ответ 2
Для справки, вот что видно на 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();
}
}
});
}
}