Bạn có thể sử dụng phương thức getWidths() của lớp FontMetrics. Theo JavaDoc:
Nhận độ rộng trước của 256 ký tự đầu tiên trong Phông chữ. Tạm ứng là khoảng cách từ điểm tận cùng bên trái đến điểm tận cùng bên phải trên đường cơ sở của nhân vật. Lưu ý rằng sự tiến bộ của một String không nhất thiết là tổng của các tiến bộ của các ký tự của nó.
Bạn có thể sử dụng phương thức charWidth(char)
của lớp FontMetrics. Ví dụ:
Set<String> monospaceFontFamilyNames = new HashSet<String>();
GraphicsEnvironment graphicsEnvironment = GraphicsEnvironment.getLocalGraphicsEnvironment();
String[] fontFamilyNames = graphicsEnvironment.getAvailableFontFamilyNames();
BufferedImage bufferedImage = new BufferedImage(1, 1, BufferedImage.TYPE_INT_ARGB);
Graphics graphics = bufferedImage.createGraphics();
for (String fontFamilyName : fontFamilyNames) {
boolean isMonospaced = true;
int fontStyle = Font.PLAIN;
int fontSize = 12;
Font font = new Font(fontFamilyName, fontStyle, fontSize);
FontMetrics fontMetrics = graphics.getFontMetrics(font);
int firstCharacterWidth = 0;
boolean hasFirstCharacterWidth = false;
for (int codePoint = 0; codePoint < 128; codePoint++) {
if (Character.isValidCodePoint(codePoint) && (Character.isLetter(codePoint) || Character.isDigit(codePoint))) {
char character = (char) codePoint;
int characterWidth = fontMetrics.charWidth(character);
if (hasFirstCharacterWidth) {
if (characterWidth != firstCharacterWidth) {
isMonospaced = false;
break;
}
} else {
firstCharacterWidth = characterWidth;
hasFirstCharacterWidth = true;
}
}
}
if (isMonospaced) {
monospaceFontFamilyNames.add(fontFamilyName);
}
}
graphics.dispose();
Nguồn
2009-05-28 17:45:02
Bạn có thể thêm mã ví dụ? – Jonik
+1 cho cách tiếp cận thực tế và đơn giản; Tôi sử dụng i và m. –