java - 如何在静态类中加载字体并用作 JAR

标签 java eclipse jar

我尝试将在 Eclipse 中运行完美的游戏导出到可运行的 jar 文件。它没有正确启动,因此我尝试使用终端启动它,但收到了此错误消息:

java.io.IOException: Can't read res\fonts\slkscr.ttf
        at java.awt.Font.createFont(Unknown Source)
        at dev.tilegame.gfx.FontLoader.loadFont(FontLoader.java:12)
        at dev.tilegame.gfx.Assets.init(Assets.java:21)
        at dev.tilegame.Game.init(Game.java:55)
        at dev.tilegame.Game.run(Game.java:93)
        at java.lang.Thread.run(Unknown Source)

我使用 Assets 类来存储我的所有 Assets :

public static void init() {
    font28 = FontLoader.loadFont("res/fonts/slkscr.ttf", 28);
    font52 = FontLoader.loadFont("res/fonts/slkscr.ttf", 52);

这就是FontLoader:

public class FontLoader {

public static  Font loadFont(String path, float size){
    try {
        return Font.createFont(Font.TRUETYPE_FONT, new File(path)).deriveFont(Font.PLAIN, size);
    } catch (FontFormatException | IOException e) {
        e.printStackTrace();
        System.exit(1);
    }
    return null;
}

}

-谢谢

编辑:

实体管理器:

public class EntityManager {

private Handler handler;
private Player player;
private ArrayList<Entity> entities;
private ArrayList<Entity> postentities;
Iterator<Entity> it;
private Comparator<Entity> renderSorter = new Comparator<Entity>() {
    @Override
    public int compare(Entity a, Entity b) {
        if (a.getY() + a.getHeight() < b.getY() + b.getHeight())
            return -1;
        return 1;
    }
};

public EntityManager(Handler handler, Player player) {
    this.handler = handler;
    this.player = player;
    entities = new ArrayList<Entity>();
    postentities = new ArrayList<Entity>();
    addEntity(player);
}

public void tick() {
    Iterator<Entity> it = entities.iterator();

    while (it.hasNext()) {
        Entity e = it.next();
        e.tick();
        if (!e.isActive())
            it.remove();
    }

    for (int i = 0; i < postentities.size(); i++) {
        entities.add(postentities.get(i));
        postentities.remove(i);
    }

    entities.sort(renderSorter);
}

public void render(Graphics g) {
    for (Entity e : entities) {
        e.render(g);
    }
    player.postRender(g);
}

public void addEntity(Entity e) {
    entities.add(e);
}

public void postaddEntity(Entity e) {
    postentities.add(e);
}

最佳答案

您遇到的问题是,当您有 JAR 中的文件路径时,它是一个不透明 URL。这意味着它并不代表实际的文件,而是代表压缩 JAR 中的路径。在您的情况下,您应该使用 getResourceAsStreamInputStream 获取到正确的文件:

public static Font loadFont(String path, float size){
    try {
        Font f = Font.createFont(Font.TRUETYPE_FONT, FontLoader.class.getResourceAsStream(path));
        return f.deriveFont(size);
    } catch (FontFormatException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    return null;
}

请注意,路径应以斜杠开头;这代表 jar 文件的根目录。 (例如,“res/fonts/slkscr.ttf”变为“/res/fonts/slkscr.ttf”)

关于java - 如何在静态类中加载字体并用作 JAR,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43053114/

相关文章:

java - SimpleDateFormat - 时区不正确

java - 从带有外部 jar 文件的 Windows 命令行运行 Java 时出现 NoClassDefFoundError

java - 创建和使用自定义 jar 文件时出现问题

java - com/sun/deploy/util/WinRegistry 抛出 ClassNotFoundException Intellij Idea

java.lang.ClassNotFoundException : Didn't find class on path: dexpathlist

java - 如何正确地将当前时间戳设置到这个将值插入 MySql 表的 Java CRUD 方法中?

java - 如何在 jdbc 连接上传递用户名或用户 IP 地址?

eclipse - 每隔几分钟需要登录: eclipse. tmatesoft.com

java - 上传包错误

java - Eclipse 合并问题与 Android (Java) 项目