如何从Java中获取字体名称列表

12

在Java中,我们可以这样创建一个Font对象:

new Font("Helvetica", Font.PLAIN, 12);

我的问题是如何从Java中获取完整的字体名称列表,例如"Helvetica",我们可以将其用作Font构造函数的参数之一?

我尝试了以下操作,但在所有列表中都找不到"Helvetica"。

    GraphicsEnvironment ge;  
    ge = GraphicsEnvironment.getLocalGraphicsEnvironment();  

    String[] names = ge.getAvailableFontFamilyNames();
    Font[] allFonts = ge.getAllFonts();

    for(int x=0; x<names.length; x++)
        System.out.println(names[x]);

    for(int x=0; x<allFonts.length; x++){           
        System.out.println(allFonts[x].getName());
        System.out.println(allFonts[x].getFontName());
        System.out.println(allFonts[x].getFamily());
        System.out.println(allFonts[x].getPSName());
    }

编辑:更重要的是,我还想知道在Font构造函数中第一个属性调用是什么new Font("这是什么属性?", Font.PLAIN, 12)

问题:它是字体名称、字体族、字体类型、名称还是其他什么?



1
你能提供输出吗?在我的情况下,我看到超过10个字符串包含“Helivetica”单词。 - Maxim
@maxd,我希望我能够这样做,因为那对你们所有人都有用,但我的输出太长了。超过3000行字体。 - user3437460
请问您能否提供您使用的操作系统? - Maxim
这里是关于Font类第一个String参数的问题的答案。 - Maxim
@maxd 谢谢你的努力,我今天已经去了那个页面好几次了。但我仍然不确定它所指的“name”是哪一个。我能否认为API中提到的“name”与我可以从“allFonts[x].getName()”中获取的相同? - user3437460
显示剩余2条评论
4个回答

8

在你的系统上,该字体可能会被映射到其他字体。

Font helvetica = new Font("Helvetica", Font.PLAIN, 12);
System.out.println(helvetica.getFontName(Locale.US));

我得到了

SansSerif.plain

要输出所有本地字体的名称,您可以使用类似以下的内容:
GraphicsEnvironment ge = GraphicsEnvironment
        .getLocalGraphicsEnvironment();

Font[] allFonts = ge.getAllFonts();

for (Font font : allFonts) {
    System.out.println(font.getFontName(Locale.US));
}

@ElliotFrisch 感谢您的帮助,但我仍然没有在我的字体列表中看到它。我要找的“Helvetica”是什么?它被称为fontName、family、fontFace、font还是name?知道了这一点,我就能知道使用哪种方法来获取可填充Font构造函数的字符串列表。谢谢! - user3437460
1
这是字体名称,以大写字母开头,可能在您的系统上不可用(在我的系统上就不可用)。 - Elliott Frisch
非常感谢您的回复。所以我猜我可以简单地使用 allFonts[x].getFontName() 吗?我感到困惑是因为API只提到了 name 而没有提到 fontName - user3437460
1
字体(和排版)是一个相当复杂的话题,而Helvetica这个名字指的是一种字体。您可以调用Font.getName()返回此Font的逻辑名称,或者Font.getFontName(),它表示(例如)Helvetica Bold可能会被返回为字体名称 - Elliott Frisch

4
这个程序将展示您系统中所有字体的列表:
import java.awt.GraphicsEnvironment;

public class ListJavaFonts
{

  public static void main(String[] args)
  {
    String fonts[] = 
      GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames();

    for ( int i = 0; i < fonts.length; i++ )
    {
      System.out.println(fonts[i]);
    }
  }

}

4
new Font("Helvetica", Font.PLAIN, 12);

在这种情况下,最好使用类似以下的方式:
new Font(Font.SANS_SERIF, Font.PLAIN, 12);

那将产生该操作系统上默认使用的未装饰字体。在Windows上,它将是Arial。在OS X上,它将是Helvetica。在*nix机器上,它可能是其中之一,或者是第三个未装饰的字体。针对您的具体问题,我始终发现“字体系列”字符串对于创建字体实例非常有用。

2

我知道这是一个老问题,但还有一些未解答的问题。

更重要的是,我也想知道Font构造函数中new Font("What attribute is this?", Font.PLAIN, 12)第一个属性调用的是什么?它是字体名称、家族、字体面、名称还是其他什么?

如果你使用IDE(我使用的是IntelliJ)反编译Java类,你会看到:

public Font(String name, int style, int size) {
    this.name = (name != null) ? name : "Default";
    this.style = (style & ~0x03) == 0 ? style : 0;
    this.size = size;
    this.pointSize = size;
}
public String getName() {
        return name;
    }
public String getFontName() {
  return getFontName(Locale.getDefault());
}

这段文字告诉你在调用构造函数时使用的名称可以通过getName获取,但是调用getFontName会返回默认文本。这就是为什么你可以将名称设置为Helvetica,然后调用getFontName,它会返回与Helvetica不同的东西。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接