Java: как узнать высоту кепки и x-высоту шрифта?

FontMetrics не имеет геттеров для высота крышки и x-height шрифта.

Как я могу получить эти значения?

Что касается высоты крышки, то нет гарантии для конкретной заглавной буквы, что восхождение по букве совпадает с высотой крышки. (например, капитал H не гарантированно плоский сверху)

Что касается высоты x, я предполагаю, что он, вероятно, такой же, как высота "x", но опять же нет гарантии.


изменить: Grr! Я просто попробовал FontMetrics.getBounds() и FontMetrics.getLineMetrics() для конкретных символьные последовательности, и я всегда получаю одинаковый ответ для высот (getBounds() действительно отличается по ширине). В методе hasUniformLineMetrics() есть примечание о шрифтометрах с несколькими шрифтами для покрытия набора символов, но это охватывает группы символов, а не отдельные символы.

Ответ 1

То, что вы ищете, - это окно рендеринга экрана, которое сообщает вам точный размер текста.

Это означает, что вам нужно будет предоставить информацию в какой-то момент о поверхности, на которой вы рисуете, и строке, которую вы рисуете. Причина в том, что система просто не знает визуальный результат до позднего рендеринга. Я использовал:

Graphics2D g;
g.getFont().createGlyphVector(g.getFontRenderContext(),"abc").getVisualBounds();

Вы также можете попробовать:

Graphics2D g;
g.getFont().getMaxCharBounds(g.getFontRenderContext());

У меня тоже есть проблемы с сохранением всех этих методов шрифтов.

Ответ 2

Я не работал с ним, но класс GlyphView.GlyphPainter имеет методы getAscent, getDescent и getHeight. Это может быть что-то проверить.

Ответ 3

Ну, если вы пытаетесь создать коробку с текстом, который соответствует тексту, я думаю, вы можете просто сделать высоту самого размера шрифта

Я не уверен, но я думаю, что это то, что я делал в прошлом

Ответ 4

Что касается x-height, то для меня следующий код woks:

    public double getXHeight(Font font)
    {
        FontRenderContext fc = new FontRenderContext(null, false, false);
        TextLayout layout = new TextLayout("x", font, fc);
        return layout.getBounds().getHeight();
    }