<分区>
我正在阅读一些教程,但在将字体文件加载到 Eclipse Java 项目时遇到了问题。我在 SO 上尝试了这里建议的许多解决方案,并最终找到了一个对我有用的解决方案(使用 FileInputStream),但当项目导出为可运行的 JAR 时却没有。另一方面,在我加载图标的另一个项目中使用相同的目录结构,所以我猜问题不在路径本身。
这是目录结构 :
代码如下:
package examples;
import java.awt.Font;
import java.awt.FontFormatException;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.net.URISyntaxException;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
public class Test01 extends JPanel {
String text = "Free the bound periodicals";
Font fon;
FileInputStream fis;
// InputStream fis;
@Override
public void paintComponent(Graphics comp) {
Graphics2D comp2D = (Graphics2D) comp;
// This (for another project) works both in Eclipse and in runnable JAR
// ImageIcon loadIcon = new ImageIcon(getClass().getResource("/examples/resources/load.gif"));
// This (quite contrary to many SO suggestions) doesn't work in Eclipse for this project, why?
// fis = this.getClass().getResourceAsStream("/examples/resources/vedrana.ttf");
// This (quite contrary to many SO suggestions) doesn't work in Eclipse for this project, why?
// fis = this.getClass().getClassLoader().getResourceAsStream("/examples/resources/verdana.ttf");
// This works within Eclipse project but not when exported to runnable JAR,
// Moreover many suggest that InputStream should be favored over FileInputStream
try {
fis = new FileInputStream(new File(getClass().getResource("/examples/resources/verdana.ttf").toURI()));
} catch (FileNotFoundException e1) {
JOptionPane.showMessageDialog(this, "FileNotFoundException!");
} catch (URISyntaxException e1) {
JOptionPane.showMessageDialog(this, "URISyntaxException!");
} catch (Exception e1) {
JOptionPane.showMessageDialog(this, "NullPointerException!");
}
try {
fon = Font.createFont(Font.TRUETYPE_FONT, fis);
} catch (FontFormatException e) {
// TODO Auto-generated catch block
System.out.println("Error - FontFormatException " + e.getMessage());
} catch (IOException e) {
// TODO Auto-generated catch block
System.out.println("Error - IOException " + e.getMessage());
}
fon = fon.deriveFont(Font.PLAIN, 72);
FontMetrics metrics = getFontMetrics(fon);
comp2D.setFont(fon);
comp2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
int x = (getSize().width - metrics.stringWidth(text)) / 2;
int y = getSize().height / 2;
comp2D.drawString(text, x, y);
}
public static void main(String[] args) {
JFrame mainFrame = new JFrame("Main Menu");
mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
mainFrame.setSize(1000, 250);
mainFrame.setVisible(true);
mainFrame.add(new Test01());
// mainFrame.pack();
}
}
所以,困扰我的是:
- 为什么这不起作用(似乎找不到字体文件),因为它抛出 空指针异常
fis = this.getClass().getResourceAsStream("/examples/resources/vedrana.ttf");
这也行不通
fis = this.getClass().getClassLoader().getResourceAsStream("/examples/resources/verdana.ttf");
- 为什么这在 Eclipse 项目中有效,但在导出到 可运行的 JAR
fis = new FileInputStream(new File(getClass().getResource("/examples/resources/verdana.ttf").toURI()));
更新 事实证明这会起作用:
fis = this.getClass().getClassLoader().getResourceAsStream("examples/resources/verdana.ttf");
问题出在第一个斜杠 - 路径应该是“examples/resources/verdana.ttf”而不是“/examples/resources/verdana.ttf”。它适用于 Eclipse 和可运行的 JAR。
现在,让我感兴趣的是为什么在这种情况下第一个斜线是必要的
ImageIcon loadIcon = new ImageIcon(getClass().getResource("/examples/resources/load.gif"));
更新 2: 在沮丧为什么这个方法不起作用之后
InputStream fis = this.getClass().getResourceAsStream("/examples/resources/verdana.ttf");
我从 Eclipse 中删除了整个类,现在这两种方法都可以在 Eclipse 和 runanble JAR 中运行——就像它应该的那样。
InputStream fis = this.getClass().getResourceAsStream("/examples/resources/verdana.ttf");
或
InputStream fis = this.getClass().getClassLoader().getResourceAsStream("examples/resources/verdana.ttf");