Java JLabel HTML 在字体与系统字体冲突时显示乱码

标签 java html swing encoding jlabel

已更新 - 问题现在以一种丑陋的方式解决了 - 但必须有一个正确的方法来做到这一点?

当字体名称与系统上已安装的字体名称冲突时,我在使用 JLabel 中的 HTML 以自定义字体呈现文本时遇到问题。

系统字体采用不同的格式(otf 与 ttf),因此文本出现乱码也就不足为奇了。

调用 GraphicsEnvironment.getLocalGraphicsEnvironment().registerFont 返回 false 以显示字体注册失败。所以我想问题是,有没有办法不用注册就可以使用这个字体,或者有办法在注册之前重命名它?

我现在已经通过编辑 ttf 文件并修改字体名称来解决我的问题,从而使冲突极不可能发生,但我猜必须有一种正确的方法来处理这种情况。

package test;

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Font;
import java.awt.FontFormatException;
import java.awt.GraphicsEnvironment;
import java.io.IOException;
import java.io.InputStream;
import javax.swing.JApplet;
import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

@SuppressWarnings("serial")
class MyComponent extends JPanel {
    Font font; String text;
    public MyComponent(Font f) {font=f;}
    public void initSwing()
    {
        final String labelcontents = "<html><center>foo</center></html>";
        System.out.println(labelcontents);
        JLabel text = new JLabel(labelcontents);
        text.setFont(font);
        add(text,BorderLayout.CENTER);
    }
}

@SuppressWarnings("serial")
public class TestApplet extends JApplet {
        public void init()
        {
            Font mainFont = null;
            InputStream is = getClass().getResourceAsStream("fonts/Exo-Bold.ttf");
            try {
                mainFont = Font.createFont(Font.TRUETYPE_FONT, is).deriveFont(24f);
                System.out.println(mainFont.getName());
                boolean registered=GraphicsEnvironment.getLocalGraphicsEnvironment().registerFont(mainFont);
                System.out.println("registered "+registered);
            } catch (FontFormatException e1) {
                e1.printStackTrace();
            } catch (IOException e1) {
                e1.printStackTrace();
            }

            final Container fframe = (JComponent)(getContentPane());
            final MyComponent component = new MyComponent(mainFont);

            Thread t = new Thread(new Runnable() {
                public void run() { try {

                    SwingUtilities.invokeAndWait(new Runnable() {public void run() {
                        fframe.add(component);
                        component.initSwing();
                        fframe.revalidate();
                        fframe.repaint();
                    }});

                } catch (Exception e) {
                    e.printStackTrace();
                } }
            });
            t.start();
        }
}

最佳答案

也许文本包含带有字符集等的 HTML 命令。

String text1 = "<html><body>"
    + text.replace("&", "&amp;")
          .replace("<", "&lt;")
          .replace(">", "&gt;");
    + "</body></html>";

关于Java JLabel HTML 在字体与系统字体冲突时显示乱码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33970413/

相关文章:

java - 如何在java字符串中查找单词java中大小写连续的个数

java - 如何用JSoup进行分页

java - 导入导致 verifyError? java

javascript - 可见时自动淡出 Div

java - Spring 启动 : Let servlet dispatcher address only static content or handlers

javascript - html 和 javascript 网页的密码验证

html - 如何在 Electron 浏览器上加载嵌入在 iFrame 中的 PDF 文件

java - JLabel 位于 JSplitPane 前面

java - 关于 Java 的外观

java - Swing 对 JList 的 MVC 实现有问题吗?