所以我正在加载字体并使用它进行打印 - 但是,它仍然无法工作。我尝试了很多东西,最后还是来找你们。这是加载的代码:
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);
}
答案 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);
}