SWT - 获取等宽字体的操作系统不可知方法

2022-09-01 12:44:10

在 SWT 中,有没有办法简单地获得一个等宽字体,它适用于各种操作系统?

例如。这适用于Linux,但不适用于Windows:


Font mono = new Font(parent.getDisplay(), "Mono", 10, SWT.NONE);

或者我是否需要一种方法来尝试加载不同的字体(Consolas,Terminal,Monaco,Mono),直到一个不为空?或者,我可以在启动时在属性文件中指定它。

我尝试从Display中获取系统字体,但这不是等宽的。


答案 1

我花了一段时间来抨击这个,直到我意识到显然eclipse必须能够访问等宽字体才能在其文本字段,控制台等中使用。一个小小的挖掘出现了:

Font terminalFont = JFaceResources.getFont(JFaceResources.TEXT_FONT);

如果您感兴趣的只是掌握一些等宽字体,那么它的工作原理。

编辑:或者根据@ctron的评论:

Font font = JFaceResources.getTextFont();

编辑:警告(基于@Lii的评论):这将为您提供配置的文本字体,该字体可以由用户覆盖,并且可能不是等宽字体。但是,它将与编辑器和控制台中使用的字体一致,例如,这可能是您想要的。


答案 2

根据国际化支持相关 API 的 JDK 文档中有关字体配置文件的部分,逻辑 Fonts 的概念用于定义某些独立于平台的字体,这些字体映射到默认字体配置文件中的物理字体:

Java 平台定义了每个实现都必须支持的五个逻辑字体名称:Serif、SansSerif、Monospaced、Dialog 和 DialogInput。这些逻辑字体名称以依赖于实现的方式映射到物理字体。

所以在你的情况下,我会尝试

Font mono = new Font(parent.getDisplay(), "Monospaced", 10, SWT.NONE);

获取当前运行代码的平台的物理等宽字体的句柄。

编辑:似乎SWT对逻辑字体一无所知(eclipse.org 上的Bug 48055详细描述了这一点)。在此错误报告中,建议了一个黑客式的解决方法,其中可以从AWT字体中检索物理字体的名称...


推荐