2

为什么 GraphicsEnvironment 的 getAllFonts() 方法返回的字体与 fc-list 不同(在 linux 上?)

fc-list 返回:

Abyssinica SIL:style=Regular
Cantarell:style=Bold
Cantarell:style=Regular
Century Schoolbook L:style=Bold
Century Schoolbook L:style=Bold Italic
Century Schoolbook L:style=Italic
Century Schoolbook L:style=Roman
Courier:style=Regular
DejaVu Sans,DejaVu Sans Condensed:style=Condensed Bold,Bold
DejaVu Sans,DejaVu Sans Condensed:style=Condensed Bold Oblique,Bold Oblique
DejaVu Sans,DejaVu Sans Condensed:style=Condensed,Book
DejaVu Sans,DejaVu Sans Condensed:style=Condensed Oblique,Oblique
DejaVu Sans,DejaVu Sans Light:style=ExtraLight
DejaVu Sans Mono:style=Bold
DejaVu Sans Mono:style=Bold Oblique
DejaVu Sans Mono:style=Book
DejaVu Sans Mono:style=Oblique
DejaVu Sans:style=Bold
DejaVu Sans:style=Bold Oblique
DejaVu Sans:style=Book
DejaVu Sans:style=Oblique
DejaVu Serif,DejaVu Serif Condensed:style=Condensed Bold,Bold
DejaVu Serif,DejaVu Serif Condensed:style=Condensed Bold Italic,Bold Italic
DejaVu Serif,DejaVu Serif Condensed:style=Condensed,Book
DejaVu Serif,DejaVu Serif Condensed:style=Condensed Italic,Italic
DejaVu Serif:style=Bold
DejaVu Serif:style=Bold Italic
DejaVu Serif:style=Book
DejaVu Serif:style=Italic
Dingbats:style=Regular
...

然而

GraphicsEnvironment 中的 getAllFonts 返回:

AbyssinicaSIL
CenturySchL-Bold
CenturySchL-BoldItal
CenturySchL-Ital
CenturySchL-Roma
DejaVuSans
DejaVuSans-Bold
DejaVuSans-BoldOblique
DejaVuSansCondensed
DejaVuSansCondensed-Bold
DejaVuSansCondensed-BoldOblique
DejaVuSansCondensed-Oblique
DejaVuSans-ExtraLight
DejaVuSansMono
DejaVuSansMono-Bold
DejaVuSansMono-BoldOblique
DejaVuSansMono-Oblique
DejaVuSans-Oblique
DejaVuSerif
DejaVuSerif-Bold
DejaVuSerif-BoldItalic
DejaVuSerifCondensed
DejaVuSerifCondensed-Bold
DejaVuSerifCondensed-BoldItalic
DejaVuSerifCondensed-Italic
DejaVuSerif-Italic
Dialog.bold
Dialog.bolditalic
Dialog.italic
Dialog.plain
DialogInput.bold
DialogInput.bolditalic
DialogInput.italic
DialogInput.plain
Dingbats
...

比较这两个不同的列表,示教列表具有彼此不可用的字体。

谁能解释发生了什么?


进一步说明:

我首先提出这个问题的原因是,我试图找出一些 UI 问题,即在一个操作系统(例如 Solaris)上定义的字体与在另一个操作系统(例如 Linux)上定义的字体不同。

我认为问题在于,虽然两个操作系统具有相同的逻辑字体(对话框),但它们不一定具有相同的物理字体。

但是如果你制作这样的字体:

Font STANDARD_FONT = new Font("Dialog", 0, 12); 

不能保证在任何地方都相同。

我希望我可以查看两个系统上可用的字体,看看哪些是通过 fc-list 可用的,但是 java (Dialog.plain) 报告的字体不是 fc-list 列出的字体。

因此,如果我通过 new Font("Dialog", 0, 12) 定义逻辑字体,则通过 java 可用的 API(例如 font.getName() 等)显示:

postscript - Dialog.plain 系列 - 对话框名称 - Dialog fontName - Dialog.plain 大小 - 12

我怎样才能准确地知道 java 选择用于 Dialog Family 的物理字体?

4

1 回答 1

1

专门出现的字体系列getAllFonts()不是物理字体,这意味着它们不是您计算机上的字体文件,因此fc-list不会找到它们。它们是每个 Java 实现中常见的字体系列,并映射到物理字体。

逻辑字体是 Java 平台定义的五个字体系列,任何 Java 运行时环境都必须支持:Serif、SansSerif、Monospaced、Dialog 和 DialogInput。这些逻辑字体不是实际的字体库。相反,逻辑字体名称由 Java 运行时环境映射到物理字体。

至于 专有的字体系列fc-list,它们很可能是您系统上的物理字体,您正在运行的 Java 实现不支持这些字体。Java 实现需要支持的唯一字体类型是 TrueType;专有的字体fc-list可能不是 TrueType。

Java 平台的所有实现都必须支持 TrueType 字体;对其他字体技术的支持取决于实现。

来源:Java 的FontAPI 文档

于 2013-03-11T02:26:53.087 回答