Как Вы тянете строку, центрируемую вертикально в Java?

Если преимущество использования статического класса не в том, чтобы создавать экземпляр объекта и использовать метод, тогда просто объявите класс как открытый, а этот метод как статический.

20
задан Paul Alexander 28 June 2009 в 21:42
поделиться

3 ответа

Примечание. вы должны точно учесть, что вы подразумеваете под вертикальным центрированием.

Шрифты отображаются на базовой линии по нижней части текста. Вертикальное пространство распределяется следующим образом:

---
 ^
 |  leading
 |
 -- 
 ^              Y     Y
 |               Y   Y
 |                Y Y
 |  ascent         Y     y     y 
 |                 Y      y   y
 |                 Y       y y
 -- baseline ______Y________y_________
 |                         y                
 v  descent              yy
 --

Интерлиньяж - это просто рекомендуемый для шрифта интервал между строками. Для центрирования по вертикали между двумя точками вы должны игнорировать интерлиньяж (это ведущий, кстати, а не ведущий; в общем типографике это / был интервал между строками на печатной форме).

Итак, для центрирования текста восходящие и нисходящие, вы хотите

baseline=(top+((bottom+1-top)/2) - ((ascent + descent)/2) + ascent;

Без заключительного «+ подъема» у вас есть позиция для верхней части шрифта; поэтому добавление подъема идет от вершины к базовой линии.

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

48
ответ дан 29 November 2019 в 22:50
поделиться

Я нашел рецепт здесь .

Ключевыми методами кажутся getStringBounds () и getAscent ()

// Find the size of string s in font f in the current Graphics context g.
FontMetrics fm   = g.getFontMetrics(f);
java.awt.geom.Rectangle2D rect = fm.getStringBounds(s, g);

int textHeight = (int)(rect.getHeight()); 
int textWidth  = (int)(rect.getWidth());
int panelHeight= this.getHeight();
int panelWidth = this.getWidth();

// Center text horizontally and vertically
int x = (panelWidth  - textWidth)  / 2;
int y = (panelHeight - textHeight) / 2  + fm.getAscent();

g.drawString(s, x, y);  // Draw the string.

(примечание: приведенный выше код подпадает под действие лицензии MIT , как указано на странице .)

11
ответ дан 29 November 2019 в 22:50
поделиться

Не уверен, что это помогает, но drawString (s, x, y) устанавливает базовую линию текста в y.

Я был работал с вертикальным центрированием и не мог заставить текст выглядеть правильно, пока не заметил это поведение, упомянутое в документах. Я предполагал, что нижняя часть шрифта находится на y.

Для меня исправление заключалось в вычитании fm.getDescent () из координаты y.

2
ответ дан 29 November 2019 в 22:50
поделиться
Другие вопросы по тегам:

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