您可以尝试设置环境变量来启动 JVM,以使其知道目录路径。对于您的情况,这可以由 来完成。我的答案是基于 archlinux wiki 的 Java Runtime Enviroment fonts 文章。JAVA_FONTS
export JAVA_FONTS=/usr/lib/fonts
编辑:
在未安装字体的VM中进行测试表明,设置JAVA_FONTS不起作用,我得出的结论是,通过您的设置,可能无法实现您的目标。
我使用以下程序在未安装字体的VM上重现错误:
import javax.swing.*;
public class example{
public static void main(String[] tArgs){
JFrame j = new JFrame();
j.add(new JButton("Test"));
j.setVisible(true);
j.pack();
}
}
这是我的Stacktrace:https://pastebin.com/fy3JDnkN
给定X11FontManager的来源,当字体管理器在行中构造时发生错误。for (int i=0; i<fontConfigFonts.length; i++) {
public String[] getDefaultPlatformFont() {
if (defaultPlatformFont != null) {
return defaultPlatformFont;
}
String[] info = new String[2];
getFontConfigManager().initFontConfigFonts(false);
FontConfigManager.FcCompFont[] fontConfigFonts =
getFontConfigManager().getFontConfigFonts();
for (int i=0; i<fontConfigFonts.length; i++) {
if ("sans".equals(fontConfigFonts[i].fcFamily) &&
0 == fontConfigFonts[i].style) {
info[0] = fontConfigFonts[i].firstFont.familyName;
info[1] = fontConfigFonts[i].firstFont.fontFile;
break;
}
}
/* Absolute last ditch attempt in the face of fontconfig problems.
* If we didn't match, pick the first, or just make something
* up so we don't NPE.
*/
if (info[0] == null) {
if (fontConfigFonts.length > 0 &&
fontConfigFonts[0].firstFont.fontFile != null) {
info[0] = fontConfigFonts[0].firstFont.familyName;
info[1] = fontConfigFonts[0].firstFont.fontFile;
} else {
info[0] = "Dialog";
info[1] = "/dialog.ttf";
}
}
defaultPlatformFont = info;
return defaultPlatformFont;
}
这使得无法手动添加字体,因为NullPointerException发生在我们访问字体管理器之前,这种行为接缝在几行之后的注释中不打算使用。
如果有另一个适用于Linux的FontManager在没有安装默认系统字体的情况下不会崩溃,那么仍然有可能实现您的目标,但我找不到这样的替代品。