当前位置: 首页 > 面试题库 >

JLabel html文本忽略setFont

姬和豫
2023-03-14
问题内容

我刚刚开始将Swing应用程序从OS X移植到Windows,使用JLabels会很麻烦。

我注意到,setFont如果标签的文本是HTML ,则指定为的字体将被忽略(在Mac上不会发生)。HTML格式极其有用,可提高复杂显示的可读性。

通常情况下,我会在HTML标记中指定字体,但是我使用的字体是在运行时通过Font.createFontJAR中的ttf
加载的。我尝试在font标签中使用加载的字体的名称,但这没有用。

有什么办法可以在Windows上使用awt.FontHTML格式的加载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();}
                        }
                });
        }

}

编辑:有趣的是,如果我使用JRE的lib /
fonts文件夹中的ttf之一(在这种情况下,此处的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副本)。


问题答案:

registerFont()

我在搜寻是否可以.ttf在运行时将a复制到JRE时发现了这个小宝石。它确实可以实现预期的功能。如果用于Font.createFont在运行时加载字体,请执行以下操作:

GraphicsEnvironment.getLocalGraphicsEnvironment().registerFont(myCreatedFont)

在JRE上注册。

这样一来,字体就可以显示为HTML文本,也可以显示为Windows纯文本!



 类似资料:
  • 有人能帮帮我吗?

  • 问题内容: 我正在开发一个使用Spring-boot,关系数据库和Elasticsearch的应用程序。 我在代码的2个不同位置使用JSON序列化: 在REST API的响应中。 当代码与Elasticsearch交互时。 我在Elasticsearch中需要一些属性,但我想向应用程序用户隐藏(例如,来自关系数据库的内部ID)。 这是一个实体的例子: 问题 :当对象持久化在Elasticsearc

  • 我在settigns.xml文件中添加了代理配置,但Maven没有使用它,我通过使settings.xml文件无效来确认这一点。我运行maven install命令来更新设置和全局设置以指向正确的文件,仍然没有运气。我正在使用maven3.0.4。

  • 3.2.6.1.1. 忽略文件 如果有些文件不想与其他设备同步,则可以将其添加到忽略文件列表里,忽略文件存储在每个任务目录下的 .verysync/IgnoreList中,每行一个规则。 可以直接用普通文本编辑器修改该文件,也可以在界面目录选项里的忽略列表编辑器中进行修改。 忽略文件的修改仅在本机生效,并不会同步到其它设备上。 提示: 被忽略文件列表规则匹配到的文件将不扫描,不索引,不接收。 如果

  • 项目中经常会生成一些Git系统不需要追踪(track)的文件。典型的是在编译生成过程中 产生的文件或是编程器生成的临时备份文件。当然,你不追踪(track)这些文件,可以 平时不用"git add"去把它们加到索引中。 但是这样会很快变成一件烦人的事,你发现 项目中到处有未追踪(untracked)的文件; 这样也使"git add ." 和"git commit -a" 变得实际上没有用处,同时