我正在使用“物理字体”编写一个小程序,我将其嵌入到 jar 文件中,如下所示:
javac Test.java
jar -cf Test.jar Test.class *.ttf
编译没有错误,字体与源代码在同一目录中,并成功嵌入到生成的 jar 中。
字体为 LiberationSerif-Regular.ttf
这是一个近乎最小的示例 Test.java 的代码
import java.applet.*;
import java.awt.*;
import java.io.*;
public class Test extends Applet {
Font font;
public Test() {
try {
InputStream f;
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
ClassLoader classLoader = getClass().getClassLoader();
f=classLoader.getResourceAsStream("LiberationSerif-Regular.ttf");
font=Font.createFont(Font.TRUETYPE_FONT,f).deriveFont(15.0f);
System.out.println(ge.registerFont(font));
System.out.println("ok");
}
catch(Exception e) {
System.out.println("oops");
System.out.println(e.getMessage());
}
}
public void init() {
setLayout(new FlowLayout());
Button b=new Button("Am I serifed ?");
add(b);
b.setFont(font);
}
}
这是文件 Go.html
<HTML>
<HEAD></HEAD>
<BODY>
<APPLET CODE = "Test.class" ARCHIVE="Test.jar" WIDTH = 400 HEIGHT=200>
</APPLET>
</BODY>
</HTML>
我将 Go.html 和 Test.jar 复制到一个新目录,我 cd 到那个目录,然后我运行
appletViewer Go.html
它在控制台中输出:
true
ok
但是小程序中的按钮使用的是默认字体,而不是我提供的字体(不过,它的大小是正确的 13pt)。
使用 java 1.7.0_25 在 Windows 7 上测试
置换 add(b); 和 b.setFont(字体); 没有帮助。
我还通过将生成的代码放在我的网站上并从 Mac 和带有 Firefox 的 PC 上浏览它来测试生成的代码:它可以在 mac 上运行,但不能在 pc 上运行!Firefox 在两台机器上都有相同的 Java 插件版本:1.7.0_25。mac 和 pc 都没有在其操作系统中安装此字体。
如果我要求小程序在paint(Graphics g) 函数中使用物理字体绘制一个字符串,它就可以工作!(在三个测试中!)所以小程序有字体。它甚至可以在不使用 ge.registerFont(font) 注册字体的情况下工作。
我试图在小程序中添加其他带有逻辑字体的按钮:它有效。但是逻辑字体,虽然它们有与系统无关的名称,但最终却具有与系统相关的形状和大小,所以这不是我想要的。
我的猜测是我忘记了一些操作,但是哪个?
任何帮助表示赞赏。