【问题标题】:Using a custom font for a JLabel为 JLabel 使用自定义字体
【发布时间】:2014-01-12 23:18:29
【问题描述】:

我试图在我的 JFrame 中使用一种特殊字体,但我遇到了问题。我有一个这样定义的 JLabel:

private JLabel lab = new JLabel("Text");

我有一个名为 CUSTOMFONT-MEDIUM.TTF(TrueType 字体)的文件,但在编写以下内容后:

    try {
    lab.setFont(Font.createFont(Font.TRUETYPE_FONT, getClass().getResource("/CUSTOMFONT-MEDIUM.TTF").openStream()));
    } catch(IOException ex){
    //exception handled here I suppose  
    } catch(FontFormatException ex2) {
    //same here
    }

代码编译,一切正常,除了“实验室”没有显示,所以没有文本。我想这是因为我从未指定字体大小应该是什么,但我所做的任何尝试都失败了。有人可以帮我吗?

【问题讨论】:

    标签: java swing fonts jlabel


    【解决方案1】:

    @sasankad 基本正确 (+1)。

    创建字体后,默认大小为1

    Font font = Font.createFont(Font.TRUETYPE_FONT, getClass().getResourceAsStream("/CUSTOMFONT-MEDIUM.TTF"));  
    

    然后你需要导出你想要的字体大小和样式。

    Font biggerFont = font.deriveFont(Font.BOLD, 48f);
    

    import java.awt.Dimension;
    import java.awt.EventQueue;
    import java.awt.Font;
    import java.awt.FontFormatException;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.GridBagLayout;
    import java.io.File;
    import java.io.IOException;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.UIManager;
    import javax.swing.UnsupportedLookAndFeelException;
    
    public class TestCustomFont {
    
        public static void main(String[] args) {
            new TestCustomFont();
        }
    
        public TestCustomFont() {
            EventQueue.invokeLater(new Runnable() {
                @Override
                public void run() {
                    try {
                        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                    } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                        ex.printStackTrace();
                    }
    
                    JFrame frame = new JFrame("Testing");
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    frame.add(new TestPane());
                    frame.pack();
                    frame.setLocationRelativeTo(null);
                    frame.setVisible(true);
                }
            });
        }
    
        public class TestPane extends JPanel {
    
            public TestPane() {
                setLayout(new GridBagLayout());
                try {
                    Font font = Font.createFont(Font.TRUETYPE_FONT, getClass().getResourceAsStream("/Royal Chicken.ttf"));
                    JLabel happy = new JLabel("Happy little Miss Chicken");
                    happy.setFont(font.deriveFont(Font.BOLD, 48f));
                    add(happy);
                } catch (FontFormatException | IOException ex) {
                    ex.printStackTrace();
                }
            }
    
        }
    
    }
    

    查看java.awt.Font了解更多详情...

    您可能还想看看Physical and Logical Fonts, Font Configuration Files

    【讨论】:

    • 感谢您的回复。行: font = Font.createFont(Font.TRUETYPE_FONT, getClass().getAsStream("/CUSTOMFONT-MEDIUM.TTF")) 不会编译:“方法“getAsStream(String)”未定义类
    • @FaithReaper 这就是它所说的,只是你得到的第一个实例的大小为1,你需要从中派生一个新的大小。大多数现代字体不是基于像素的,因此可以调整为您想要的任何大小
    • 还有一个有用的点,就是即使注册器不是必须的,你也可以注册一个特定的大小,当你使用它时所有的大小都可用,如果字体文件包含你想要的大小采用。您可以注册48f 并使用大小14,反之亦然。它也适用于风格。如果您想使用不同的样式和字体大小,可能会很方便。
    • @MadProgrammer 是的,我同意。还有风格,关于那个我不太明白。这是因为文件包含样式?另一件事是,如果您仅在获得一种字体后派生,但如果您注册该字体,您将获得所有文件包含的内容。如果我错了,请纠正我...
    • @FaithReaper 并非如此,真正的字体没有关联的“大小”,它是一种基于矢量的算法,可以缩放到你想要的任何大小,所以,从技术上讲,你根本不注册大小,您只需注册公式就需要对其进行缩放。 opentype 和 post script 字体也是如此
    【解决方案2】:

    您创建的字体必须首先在GraphicsEnvironment 中注册,以便所有人都可以访问并导出字体的大小:

    Font font = Font.createFont(Font.TRUETYPE_FONT, getClass().getResource("/CUSTOMFONT-MEDIUM.TTF").openStream());   
    
    GraphicsEnvironment genv = GraphicsEnvironment.getLocalGraphicsEnvironment();
    genv.registerFont(font);
    // makesure to derive the size
    font = font.deriveFont(12f);
    

    【讨论】:

    • 好的,那我想换个方式,还有其他方法吗?我只想使用 lab.setFont() 但我需要决定字体样式(即使 TrueType 文件设置为中等),如果我键入 Font.PLAIN 之类的内容,则会出现错误。
    • “您创建的字体必须首先在 GraphicsEnvironment 中注册” - 我不需要注册它,但您是对的。创建后,新的Font 的大小为1,您需要派生新的大小...
    • @MadProgrammer 也许你能帮忙?我想做的是这样的: Font f = new Font(getClass().getResource("/CUSTOMFONT-MEDIUM.TTF"),{style},17) 后跟 lab.setFont(f) 但我没有不知道用什么代替 {style} 并且阅读文档也无济于事。
    • @sid font = font.deriveFont(12f); 是您要查找的密钥。我添加了一个示例来说明我的意思,但@sasankad 是正确的,值得称赞的是首先回答
    • @MadProgrammer,是的,你是对的,在 GraphicsEnvironment 中注册字体不是必须的。
    猜你喜欢
    • 1970-01-01
    • 2012-01-15
    • 1970-01-01
    • 1970-01-01
    • 2013-07-19
    • 1970-01-01
    • 2018-07-01
    • 1970-01-01
    相关资源
    最近更新 更多