gpt4 book ai didi

java - 加载字体文件时Eclipse Java File FileInputStream vs Input Stream

转载 作者:行者123 更新时间:2023-11-29 03:20:34 28 4
gpt4 key购买 nike

<分区>

我正在阅读一些教程,但在将字体文件加载到 Eclipse Java 项目时遇到了问题。我在 SO 上尝试了这里建议的许多解决方案,并最终找到了一个对我有用的解决方案(使用 FileInputStream),但当项目导出为可运行的 JAR 时却没有。另一方面,在我加载图标的另一个项目中使用相同的目录结构,所以我猜问题不在路径本身。

这是目录结构enter image description here :

代码如下:

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");

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com