JLabel HTML-текст игнорирует setFont - PullRequest
10 голосов
/ 01 сентября 2011

Я только что начал переносить свое приложение Swing из OS X в Windows, и с JLabel s.

все становится болезненно. Я заметил, что шрифт, указанный в setFont, игнорируется, если меткатекст HTML (это не происходит на Mac).Форматирование HTML ЧРЕЗВЫЧАЙНО полезно для удобочитаемости на сложных экранах.

В обычных условиях я бы указывал шрифт в теге HTML, но используемый шрифт загружается во время выполнения, используя Font.createFont с ттфиз банки.Я попытался использовать имя загруженного шрифта в теге шрифта, но это не сработало.

Есть ли способ использовать загруженный 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();}
                        }
                });
        }

}

РЕДАКТИРОВАТЬ: достаточно интересно, если я использую один из ttf из папки lib / fonts JRE (в данном случае один из шрифтов 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();}
        }
    });
}

РЕДАКТИРОВАТЬ 2: Метод, описанный здесь для установки шрифта JLabel по умолчанию, имеет точно такую ​​же проблему (обычный текст показывает отлично, html'd текст не делает): Изменение шрифта JLabel по умолчанию

РЕДАКТИРОВАТЬ 3: Я заметил, что даже случайные шрифты из dafont будут работать, если они установлены в системе (даже с этим точным кодом, где я загружаю копию [теперь установленного] ttf из файла).

Ответы [ 2 ]

12 голосов
/ 02 сентября 2011

registerFont()

Я нашел этот маленький драгоценный камень, пока гуглил, могу ли я скопировать .ttf в JRE во время выполнения. Он делает именно то, что должен. Если вы используете Font.createFont для загрузки шрифта во время выполнения, просто выполните:

GraphicsEnvironment.getLocalGraphicsEnvironment().registerFont(myCreatedFont)

чтобы зарегистрировать его в JRE.

Это позволяет шрифту отображаться как в тексте HTML, так и в виде обычного текста в Windows!

4 голосов
/ 01 сентября 2011

Для справки вот что видно на 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();
                }
            }
        });
    }
}
...