Тестирование, является ли Шрифт моноширинным в Java

Просто дайте ему цвет CSS

, например:

a
{
 color:red;
}
12
задан Michael Myers 28 May 2009 в 17:26
поделиться

4 ответа

Сравните нарисованные длины нескольких символов (m, i, 1,. должно быть хорошим набором).

Для моноширинных шрифтов все они будут равны, для шрифтов переменной ширины - нет.

3
ответ дан 2 December 2019 в 20:41
поделиться

Согласно этот ответ , Java не слишком много знает об основных деталях шрифта, поэтому вам придется провести некоторые сравнения размеров шрифта.

1
ответ дан 2 December 2019 в 20:41
поделиться

Вероятно, не применимо в вашем случае, но если вы просто хотите установить моноширинный шрифт, используйте логическое имя шрифта:

Font mono = new Font("Monospaced", Font.PLAIN, 12);

Это будет гарантированный моноширинный шрифт. в вашей системе.

1
ответ дан 2 December 2019 в 20:41
поделиться

Вы можете использовать метод getWidths () класса FontMetrics . Согласно JavaDoc:

Получает продвинутую ширину первых 256 символов шрифта. Продвижение - это расстояние от крайней левой точки до крайней правой точки на базовой линии персонажа. Обратите внимание, что продвижение строки не обязательно является суммой продвижения ее символов.

Вы можете использовать метод charWidth (char) класса FontMetrics . Например:

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();
4
ответ дан 2 December 2019 в 20:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: