java - java SWT操作系统无法获得宽行字体

  显示原文与译文双语对照的内容
78 4

在SWT中有一种方法可以简单地获得等宽字体,这是在各种操作系统中工作的。

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





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



或者我需要一个方法,尝试加载不同的字体( 。Consolas,终端,摩纳哥,单声道),直到其中一个不为空? 或者我可以在启动时的属性文件中指定它。

我尝试从显示中获取系统字体,但它不是宽宽。

时间: 原作者:

54 4

:在web国际化支持文件中定义特定平台独立字体,并将它的映射到物理字体中的物理字体的文档

Java平台定义了五个实现必须支持的逻辑字体名称: Serif 。宋体。宽宽。对话框和 DialogInput 。 这些逻辑字体名被映射到实现依赖的物理字体。

所以在你的情况下我会试着

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

要获取当前平台的物理宽度字体的句柄,你的代码在。

Edit: SWT似乎不知道任何关于逻辑字体的东西。 在这里 Bug 报告中建议使用hackish变通方法,其中物理字体的名称可以从AWT字体中检索。

原作者:
106 3

I 在文本字段中使用monospace字体时,我发现显然 Eclipse 必须能够访问monospace字体font控制台 等等: digging


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



如果你感兴趣的是获得一些等距字体。

编辑: 或者基于 @ctron's 注释:


Font font = JFaceResources.getTextFont();



Edit: 警告( 基于 @Lii's 注释): 这将为你提供配置的文本字体,该字体可以由用户重写,并且可以能不是等宽字体。 但是,它与编辑器和控制台中使用的字体是一致的,这很可能是你所希望的。

98 1

据我所知,AWT API不公开底层字体信息。 如果你能找到它,我希望它是实现依赖的。 当然,比较几个JRE库目录中的字体映射文件,我可以看到它们不是以一致的方式定义的。

你可以加载自己的字体,但这看起来有点浪费了,因为你知道这个平台是什么。

这是加载JRE字体的hack:


private static Font loadMonospacedFont(Display display) {


 String jreHome = System.getProperty("java.home");


 File file = new File(jreHome,"/lib/fonts/LucidaTypewriterRegular.ttf");


 if (!file.exists()) {


 throw new IllegalStateException(file.toString());


 }


 if (!display.loadFont(file.toString())) {


 throw new IllegalStateException(file.toString());


 }


 final Font font = new Font(display,"Lucida Sans Typewriter", 10,


 SWT.NORMAL);


 display.addListener(SWT.Dispose, new Listener() {


 public void handleEvent(Event event) {


 font.dispose();


 }


 });


 return font;


}



它在 IBM/Win32/JRE1.4, Sun/Win32/JRE1.6, Sun/Linux/JRE1.6, 上工作,但它是一种非常脆弱的方法。 根据你对 i18n的需求,可能有太多( 我还没有检查) 问题。

另一个 hack 是测试平台上可用的字体:


public class Monotest {



 private static boolean isMonospace(GC gc) {


 final String wide ="wgh8";


 final String narrow ="1l;.";


 assert wide.length() == narrow.length();


 return gc.textExtent(wide).x == gc.textExtent(narrow).x;


 }



 private static void testFont(Display display, Font font) {


 Image image = new Image(display, 100, 100);


 try {


 GC gc = new GC(image);


 try {


 gc.setFont(font);


 System.out.println(isMonospace(gc) +"t"


 + font.getFontData()[0].getName());


 } finally {


 gc.dispose();


 }


 } finally {


 image.dispose();


 }


 }



 private static void walkFonts(Display display) {


 final boolean scalable = true;


 for (FontData fontData : display.getFontList(null, scalable)) {


 Font font = new Font(display, fontData);


 try {


 testFont(display, font);


 } finally {


 font.dispose();


 }


 }


 }



 public static void main(String[] args) {


 Display display = new Display();


 try {


 walkFonts(display);


 } finally {


 display.dispose();


 }


 }



}



这可能不是一个好方法,因为它可能会让你暴露在环境问题中。 此外,你不知道你所遇到的第一张宽字体是不是一些线圈 icon 集。

最好的方法是根据字体/地区映射白名单进行最佳猜测,并确保用户可以轻松地重新配置 UI,以通过 FontDialog

原作者:
140 4

在这个例子中,你可以下载任何字体的ttf文件,把它放到资源文件夹中( 我的/font/*,然后将这个方法添加到你的应用程序中。 它是工作 100 %.


public Font loadDigitalFont(int policeSize) {


 URL fontFile = YouClassName.class


. getResource("/fonts/DS-DIGI.TTF");


 boolean isLoaded = Display.getCurrent().loadFont(fontFile.getPath());


 if (isLoaded) {


 FontData[] fd = Display.getCurrent().getFontList(null, true);


 FontData fontdata = null;


 for (int i = 0; i <fd.length; i++) {


 if (fd[i].getName().equals("DS-Digital")) {


 fontdata = fd[i];


 break;


 }}


 if (fontdata!= null) {


 fontdata.setHeight(policeSize);


 fontdata.setStyle(SWT.BOLD);return new Font(getDisplay(), fontdata));}


 }return null; }



原作者:
...