Java:为Windows安装新字体

Java:为Windows安装新字体,java,windows,fonts,Java,Windows,Fonts,我在这里遇到了一个问题,我们有一个需要在Windows中安装特定字体的应用程序,在某些情况下,客户会丢失这些字体。 所以决定将它们与应用程序捆绑在一起,并在丢失时安装。 到目前为止,我正在测试runnable jar,其中包括所有必需的字体*.ttf作为资源,并试图从代码中安装它们 例如,我在这里检查所需字体是否丢失: GraphicsEnvironment gr = GraphicsEnvironment.getLocalGraphicsEnvironment(); String[] allS

我在这里遇到了一个问题,我们有一个需要在Windows中安装特定字体的应用程序,在某些情况下,客户会丢失这些字体。 所以决定将它们与应用程序捆绑在一起,并在丢失时安装。 到目前为止,我正在测试runnable jar,其中包括所有必需的字体*.ttf作为资源,并试图从代码中安装它们

例如,我在这里检查所需字体是否丢失:

GraphicsEnvironment gr = GraphicsEnvironment.getLocalGraphicsEnvironment();
String[] allSystemFonts = gr.getAvailableFontFamilyNames();
if (!Arrays.asList(allSystemFonts).contains("YourMissingFontName"))
{
    System.out.println("Fonts are missing, installing...");
    installMissingFonts(getLocalFonts());
}
在函数getLocalFonts中,我从嵌入式jar资源中获取字体作为文件数组

File localFontFolder = new File(
     this.getClass().getClassLoader().getResource("Fonts/")
    .getFile());
return localFontFolder.listFiles();
并使用installMissingFonts函数中的registerFont在系统中注册它们

for (File file : allFonts) {
    try{
        Font fontFile = Font.createFont(Font.TRUETYPE_FONT, file);
        gr.registerFont(fontFile);
        System.out.println("Font [" + fontFile.getFontName() +"] was registred successfully");
    }
    catch(Exception e)
    {
        System.out.println("Failed register font from ["+file+"]: "+e);
    }
}
这在一个运行时间内非常有效,如果注册完成后我再次调用check,它不会告诉我字体缺少我所需要的内容 但是,它不会将这些字体安装到C:\Windows\Fonts文件夹中,这些已注册的字体将在午餐时间后丢弃。因此,每次我运行jar时,它都会安装这些字体,但只在应用程序在其自己的虚拟空间中运行一段时间。 在Win7上以管理员身份运行它并没有帮助,它仍然只能在应用程序运行期间工作

问题: 如果需要将字体作为*.ttf文件作为资源嵌入,如何从Java代码将缺少的字体安装到系统C:\Windows\fonts


提前谢谢你

与其依赖Java代码,不如将Windows Installer MSI与应用程序捆绑在一起

您可以使用来执行此操作。使用WIX创建一个最小的无UI安装程序MSI文件,该文件只安装带有指令的字体。或者安装应用程序的完整安装程序

如果Java应用程序具有任何类型的安装程序脚本,则可以让它调用MSI文件Runtime.exec。否则,像绑定字体一样将MSI绑定为资源。在应用程序第一次运行或检测到字体丢失时,让它执行MSI文件

理想情况下,您可以让WIX构建一个完整的安装程序,将字体和Java代码安装在一起,并分发MSI或setup.exe以供启动