Por lo que yo sé, la API AWT no expone la información de fuente subyacente. Si puede acceder a ella, esperaría que dependa de la implementación. Ciertamente, al comparar los archivos de mapeo de fuentes en un par de directorios JRE lib, puedo ver que no están definidos de manera consistente.
Puede cargar sus propias fuentes, pero parece un desperdicio dado que sabe que la plataforma viene con lo que necesita.
Este es un truco que carga una fuente de 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;
}
Funciona en IBM/Win32/JRE1.4, Sun/Win32/JRE1.6, Sun/Linux/JRE1.6, pero es un enfoque bastante frágil. Dependiendo de sus necesidades de I18N, podría ser un problema allí también (no lo he comprobado).
Otro truco sería probar las fuentes disponibles en la plataforma:
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();
}
}
}
Esto probablemente no es un buen enfoque, ya que puede dejar expuesto a cuestiones locale. Además, no se sabe si la primera fuente monoespaciada que se encuentra no es un conjunto de iconos de devanados.
El mejor enfoque puede ser simplemente tomar su mejor estimación basada en una lista blanca de mapeo de fuentes/locale y asegurarse de que los usuarios puedan reconfigurar fácilmente la IU a su gusto a través del FontDialog.
Esto también debe estar disponible como java.awt.Font.MONOSPACED – nos
Parece que proporcionaron una clase [SWTFontUtils] (https://bugs.eclipse.org/bugs/attachment.cgi?id=238603) para esto ahora. – Campa