Theo hiểu biết của tôi, API AWT không hiển thị thông tin phông chữ cơ bản. Nếu bạn có thể nhận được nó, tôi hy vọng nó sẽ được thực hiện phụ thuộc. Chắc chắn, so sánh các tệp ánh xạ phông chữ trong một vài thư mục lib JRE, tôi có thể thấy rằng chúng không được định nghĩa một cách nhất quán.
Bạn có thể tải phông chữ của riêng mình, nhưng điều đó có vẻ hơi lãng phí vì bạn biết nền tảng đi kèm với những gì bạn cần.
Đây là một hack mà tải một phông chữ 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;
}
Nó hoạt động trên IBM/Win32/JRE1.4, Sun/Win32/JRE1.6, Sun/Linux/JRE1.6, nhưng là một cách tiếp cận khá mong manh. Tùy thuộc vào nhu cầu của bạn cho I18N, nó có thể là rắc rối có quá (tôi đã không kiểm tra).
Hack khác là để kiểm tra các phông chữ có sẵn trên nền tảng này:
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();
}
}
}
Điều này có lẽ không phải là một phương pháp tốt vì nó có thể để lại cho bạn tiếp xúc đối với ngôn ngữ vấn đề này. Bên cạnh đó, bạn không biết nếu phông chữ đơn cách đầu tiên bạn gặp phải không phải là một bộ biểu tượng cuộn dây.
Cách tiếp cận tốt nhất có thể là đưa ra dự đoán tốt nhất dựa trên danh sách trắng ánh xạ phông chữ/ngôn ngữ và đảm bảo rằng người dùng có thể dễ dàng định cấu hình lại giao diện người dùng cho phù hợp với mình qua FontDialog.
này cũng nên có sẵn như java.awt.Font.MONOSPACED – nos
Có vẻ như họ đã cung cấp một lớp [SWTFontUtils] (https://bugs.eclipse.org/bugs/attachment.cgi?id=238603) cho điều này ngay bây giờ. – Campa