Насколько я знаю, AWT API не предоставляет основную информацию об шрифте. Если вы можете добраться до него, я ожидаю, что он будет зависимым от реализации. Конечно, сравнивая файлы сопоставления шрифтов в нескольких каталогах JRE lib, я вижу, что они не определены согласованным образом.
Вы можете загрузить свои собственные шрифты, но это кажется немного расточительным, если вы знаете, что платформа поставляется с тем, что вам нужно.
Это хак, который загружает шрифт JRE:
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, это может быть проблемой там (я не проверял).
Другой хак будет проверить шрифты, доступными на платформе:
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();
}
}
}
Это, вероятно, не хороший подход, поскольку он может оставить вас подвергается воздействию локалите вопросы. Кроме того, вы не знаете, есть ли первый моноширинный шрифт, с которым вы сталкиваетесь, - это не набор иконок для обмоток.
Наилучший подход может состоять только в том, чтобы наилучшим образом угадать, основываясь на белом списке отображения шрифтов и локалей, и убедитесь, что пользователи могут легко перенастроить пользовательский интерфейс, чтобы удовлетворить себя через FontDialog.
Это должно также быть доступны как java.awt.Font.MONOSPACED – nos 2011-10-08 21:48:33
кажется они обеспечивают класс [SWTFontUtils] (https://bugs.eclipse.org/bugs/attachment.cgi?id=238603) для этого сейчас. – Campa 2015-07-20 07:12:49