使用自定义字体的JLabel

4

我想在我的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
    }

代码编译成功,一切正常运行,只是“lab”未显示文本。我猜是因为我从未指定字体大小,但是所有尝试都失败了。有人可以在这里帮助我吗?
2个回答

10

@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获取更多详细信息...

您还可以查看物理字体和逻辑字体、字体配置文件


感谢您的回复。这行代码:font = Font.createFont(Font.TRUETYPE_FONT, getClass().getAsStream("/CUSTOMFONT-MEDIUM.TTF")) 无法编译:“方法“getAsStream(String)”未定义于类型Class<capture#17 [...]"。您明白这里的问题是什么吗? - Sid
@FaithReaper 这基本上就是说,你得到的第一个实例大小为 1,你需要从中推导出一个新的大小。大多数现代字体不是基于像素的,因此可以调整大小以适应任何你想要的大小。 - MadProgrammer
另一个有用的点是,即使寄存器并不总是必要的,您可以注册一个特定的大小,当您使用它时,所有大小都可用,如果字体文件包含您想要使用的大小。您可以注册48f并使用大小14,反之亦然。这也适用于样式。如果您想使用不同的样式和字体大小,则可能很方便。 - WesternGun
好的,现在我更明白了,所以样式和字体大小是在我们派生时添加到字体中的属性,而不是因为它事先存在。感谢您的解释。所以即使我不注册,如果我想要使用不同的大小和样式,我也可以使用吗? - WesternGun
@FaithReaper 除非字体已经安装在系统中,否则您必须先注册才能使用它。 - MadProgrammer
显示剩余4条评论

8

你创建的字体必须首先在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之类的内容,就会出现错误。 - Sid
“你创建的字体必须首先在GraphicsEnvironment中进行注册” - 我不需要进行注册,但你在另一个方面是正确的。当创建一个新的Font时,它的大小为1,你需要派生一个新的大小... - MadProgrammer
@sid 你要找的关键是 font = font.deriveFont(12f);。我已经添加了一个示例来说明我的意思,但@sasankad是正确的,并且应该得到第一次回答的荣誉。 - MadProgrammer
@MadProgrammer,是的,你说得对,在GraphicsEnvironment中注册字体并不是必须的。 - sasankad
(附注:虽然不是必需的,但根据您想要做什么,“registerFont”并不是不正确或不可取的) - MadProgrammer
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接