我使用vgafix.otf / ttf / fon加载字体时遇到问题

时间:2015-03-14 00:24:21

标签: java fonts paintcomponent

所以我正在加载字体并使用它进行打印 - 但是,它仍然无法工作。我尝试了很多东西,最后还是来找你们。这是加载的代码:

public Font loadFont(){
    Font font = null;
    try {
        GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
        font = Font.createFont(Font.TRUETYPE_FONT, new File("vgafix.otf"));
    } catch (Exception e) {

    }
    return font;
}

这是字体变量及其打印的定义

public void paintComponent(Graphics g, String dialogue){
    Graphics2D g2 = (Graphics2D) g;
    int x = 75;
    int y = 75;
    Font fixedsys = loadFont();
    g2.drawString(dialogue,75,75);
}   

1 个答案:

答案 0 :(得分:1)

首先,永远不要捕捉异常。有许多Exception的子类,旨在让您知道您已经编写了一个编程错误(如NullPointerException)。沉默它们不会使你的代码工作,只会让你无法知道你做错了什么。

您应该只捕获需要捕获的异常类型。假设您使用的是Java 7或更高版本,则应编写catch (FontFormatException | IOException e)

其次,从不写一个空的catch块。你的情况很好地说明了为什么你不应该这样做:你完全隐藏了所有可能告诉你出错的信息。此外,沉默异常对你没有任何帮助。返回null Font有什么用?

在catch块中正确的做法是让你的代码立即大声失败,以便你知道什么是错的并且可以解决它。这有时称为故障快速设计。它通常看起来像这样:

} catch (FontFormatException | IOException e) {
    throw new RuntimeException(e);
}

第三,你可以自由定义你想要的任何公共方法,但是Swing永远不会调用带有两个参数的paintComponent方法。 Swing只调用paintComponent(Graphics)。抓住这个错误的一个好方法是将@Override放在你的方法之前;告诉编译器您要覆盖继承类中具有相同签名的方法。它没有带有该签名的继承方法,编译器会告诉您错误。

如果从paintComponent(Graphics)调用双参数方法,那么方法就可以了。否则,您需要在类中创建dialogue个(私有)字段,并更改paintComponent的方法签名以匹配它应该覆盖的方法。

第四,你没有对从调用loadFont()返回的字体做任何事情。只做Font fixedsys = loadFont();并不会改变文本的绘制方式。您需要告诉Graphics对象使用它:

Font fixedsys = loadFont();
g2.setFont(fixedsys);

第五,new File("vgafix.otf")指的是相对文件名。每个进程都有自己的当前目录,包括Java运行时。不以file separator(或驱动器号后跟文件分隔符)开头的文件是相对文件,假定通过将当前目录添加到其路径中来找到。在您的情况下,这意味着vgafix.otf必须存在于Java运行时进程的当前目录中。

如果在遵循上述建议以便看到异常之后,您发现发生了FileNotFoundException,您可能已经运行了您的程序,使得当前目录不在您预期的位置

由于目前的目录并不总是很明显,所以你应该做一些更可靠的事情。最简单的解决方案是使用绝对文件名,,如下所示:

new File("C:\\Users\\VGR\\Downloads\\vgafix.otf");

或者,在非Windows机器上:

new File("/home/vgr/Downloads/vgafix.otf");

但这不是一种可移植的方法,如果你想将你的应用程序作为.jar文件提供,肯定不会起作用。理想情况下,字体文件应与加载它的类位于同一个包中。然后你的代码可以做:

try (InputStream stream = getClass().getResourceAsStream("vgafix.otf")) {
    font = Font.createFont(Font.TRUETYPE_FONT, stream);
}