Java 使用自定义字体而不安装
我想在我的项目中使用(几种)自定义字体。以下是代码snippit: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
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")