Java 使用自定义字体而不安装

Java 使用自定义字体而不安装,java,Java,我想在我的项目中使用(几种)自定义字体。以下是代码snippit: package Panes; import java.awt.Color; import java.awt.Component; import java.awt.Dimension; import java.awt.Font; import java.awt.FontFormatException; import java.awt.GraphicsEnvironment; import java.awt.event.Mouse

我想在我的项目中使用(几种)自定义字体。以下是代码snippit:

package Panes;

import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.FontFormatException;
import java.awt.GraphicsEnvironment;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.IOException;

import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;

public class MainPane extends GradientBackground {

private static final long serialVersionUID = 1L;

public MainPane() {

    GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
    try {
        ge.registerFont(
                Font.createFont(Font.TRUETYPE_FONT, getClass().getResourceAsStream("fonts/space age.ttf")));
    } catch (FontFormatException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    } catch (IOException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }

    JFrame frame = new JFrame();
    frame.setSize(1500, 750);
    frame.setLocationRelativeTo(null);
    setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS));
    setBorder(new EmptyBorder(115, 50, 50, 50));
    frame.setUndecorated(true);
    frame.setContentPane(this);

    JLabel compName = new JLabel("O-Nut Industries");
    compName.setForeground(Color.YELLOW);
    compName.setFont(new Font("Space Age", Font.PLAIN, 86));
    compName.setAlignmentX(Component.CENTER_ALIGNMENT);

    JLabel divName = new JLabel("Aerospace Division");
    divName.setForeground(Color.YELLOW);
    divName.setFont(new Font("Space Age", Font.PLAIN, 38));
    divName.setAlignmentX(Component.CENTER_ALIGNMENT);

    JLabel progName = new JLabel(" Automated Launch System ");
    progName.setForeground(Color.YELLOW);
    progName.setFont(new Font("Enter The Grid", Font.PLAIN, 64));
    progName.setAlignmentX(Component.CENTER_ALIGNMENT);

    JButton launchBtn = new JButton("LAUNCH");
    launchBtn.setBackground(Color.GREEN);
    launchBtn.setFocusable(false);
    launchBtn.setFont(new Font("neuropol", Font.PLAIN, 68));
    launchBtn.addMouseListener(new MouseAdapter() {
        @Override
        public void mouseClicked(MouseEvent e) {
            frame.setContentPane(new LaunchPane(frame));
            frame.setVisible(true);
        }
    });

    JButton abortBtn = new JButton("ABORT");
    abortBtn.setBackground(Color.RED);
    abortBtn.setFocusable(false);
    abortBtn.setFont(new Font("neuropol", Font.PLAIN, 68));
    abortBtn.setMaximumSize(launchBtn.getPreferredSize());

    abortBtn.addMouseListener(new MouseAdapter() {
        @Override
        public void mouseClicked(MouseEvent e) {
            new AbortPane();
        }
    });

    add(compName);
    add(divName);
    add(Box.createRigidArea(new Dimension(0, 100)));
    add(progName);
    add(Box.createRigidArea(new Dimension(0, 100)));
    JPanel btnPane = new JPanel();
    btnPane.setLayout(new BoxLayout(btnPane, BoxLayout.LINE_AXIS));
    btnPane.add(launchBtn);
    btnPane.add(Box.createRigidArea(new Dimension(15, 0)));
    btnPane.add(abortBtn);
    btnPane.setOpaque(false);
    add(btnPane);
    frame.setVisible(true);
}

public static void main(String[] args) {
    init();
}

static void init() {
    new MainPane();
}
}
我以前成功地使用过这个方法,但由于某种原因,我遇到了一个“java.io.IOException:读取字体数据时出现问题”。资源文件夹(字体)是以我的项目文件夹作为父文件夹创建的,因此我几乎肯定路径是正确的。这里有什么简单的东西我遗漏了吗

谢谢

编辑-

以下是堆栈跟踪:

java.io.IOException: Problem reading font data.
at java.awt.Font.createFont0(Unknown Source)
at java.awt.Font.createFont(Unknown Source)
at Panes.MainPane.<init>(MainPane.java:30)
at Panes.MainPane.init(MainPane.java:107)

我的印象是,文件路径应该是相对于项目文件夹而不是src文件夹的,但我想不是。不管怎样,现在都可以了。谢谢大家。

stacktrace中是否没有更多详细信息?我希望在stacktrace中有一个“原因:”部分,其中包含了关于错误“原因”的更多有用信息。如果没有更多的信息,那么如果没有实际的字体以及关于JDK版本、操作系统和操作系统版本的详细信息,将很难为您提供帮助。请使用新信息编辑您的问题。注释用于讨论问题如果您知道如何在Eclipse中使用调试程序,您可能需要在createFont0中设置断点。在这种情况下,JDK抛出了异常的原因——非常糟糕的形式。在源代码中搜索“读取字体数据时出现问题”,并在那里设置断点。检查在此之前捕获的
Throwable t
中有什么异常。很抱歉,我在第30行设置了断点(createFont())并运行了调试器,但是我在哪里搜索“读取字体数据时出现问题”?您的项目文件夹在类路径上吗?资源必须位于类路径上才能以这种方式访问。stacktrace中是否没有更多详细信息?我希望在stacktrace中有一个“原因:”部分,其中包含了关于错误“原因”的更多有用信息。如果没有更多的信息,那么如果没有实际的字体以及关于JDK版本、操作系统和操作系统版本的详细信息,将很难为您提供帮助。请使用新信息编辑您的问题。注释用于讨论问题如果您知道如何在Eclipse中使用调试程序,您可能需要在createFont0中设置断点。在这种情况下,JDK抛出了异常的原因——非常糟糕的形式。在源代码中搜索“读取字体数据时出现问题”,并在那里设置断点。检查在此之前捕获的
Throwable t
中有什么异常。很抱歉,我在第30行设置了断点(createFont())并运行了调试器,但是我在哪里搜索“读取字体数据时出现问题”?您的项目文件夹在类路径上吗?资源必须位于类路径上才能以这种方式访问。
getResourceAsStream("space age.ttf")