【问题标题】:How to get list of font names from Java如何从 Java 中获取字体名称列表
【发布时间】:2015-05-01 11:15:09
【问题描述】:

在 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("What attribute is this?", Font.PLAIN, 12)

问:是 fontName、family、fontFace、名字还是什么?

【问题讨论】:

  • 你能提供输出吗?就我而言,我看到超过 10 个字符串包含 Helivetica 字。
  • @maxd 我希望我可以,因为这对你们所有人都有用,但是我的输出太长了。超过 3000 行字体。
  • 刚刚过去到 gist.github.com 或 pastebin.com
  • 能否请您也指定您的操作系统?
  • @maxd Window 7 家庭高级版 SP 1

标签: java fonts awt


【解决方案1】:

在您的系统上,该字体很可能被映射到其他东西

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 构造函数。谢谢!
  • 这是字体名称,以大写字母开头,可能在您的系统上不可用(不在我的系统上)。
  • 非常感谢您的回复。所以我想我可以简单地使用 allFonts[x].getFontName() ?我很困惑,因为 API 只提到了name 而不是fontName
  • 字体(和排版)是一个有点复杂的话题,Helvetica 这个名字指的是一种字体。您可以调用Font.getName(),它返回此Font 的逻辑名称和/或Font.getFontName(),它表示(作为示例)Helvetica Bold 可以作为字体名称返回.
【解决方案2】:
new Font("Helvetica", Font.PLAIN, 12);

在这种情况下,最好使用类似的东西:

new Font(Font.SANS_SERIF, Font.PLAIN, 12);

这将生成该操作系统默认使用的未修饰的Font

在 Windows 上它将是 Arial。在 OS X 上它将是 Helvetica。在 *nix 机器上,它可能是第三个未修饰的 Font


在回答您的具体问题时,我一直发现“字体系列”字符串对于创建字体实例很有用。

【讨论】:

    【解决方案3】:

    我知道这是一个老问题,但有一些问题没有答案。

    更重要的是,我也想知道Font构造函数中第一个属性调用是什么 new Font("What attribute is this?", Font.PLAIN, 12) Q:是fontName,family,fontFace,name还是什么?

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

    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 以外的其他内容。

    【讨论】:

      【解决方案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]);
          }
        }
      
      }
      

      【讨论】:

        猜你喜欢
        • 2013-09-20
        • 1970-01-01
        • 2019-10-02
        • 1970-01-01
        • 2023-03-24
        • 1970-01-01
        • 2023-03-27
        • 1970-01-01
        相关资源
        最近更新 更多