Если преимущество использования статического класса не в том, чтобы создавать экземпляр объекта и использовать метод, тогда просто объявите класс как открытый, а этот метод как статический.
Примечание. вы должны точно учесть, что вы подразумеваете под вертикальным центрированием.
Шрифты отображаются на базовой линии по нижней части текста. Вертикальное пространство распределяется следующим образом:
---
^
| 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;
Без заключительного «+ подъема» у вас есть позиция для верхней части шрифта; поэтому добавление подъема идет от вершины к базовой линии.
Также обратите внимание, что высота шрифта должна включать интерлиньяж, но некоторые шрифты не включают его, и из-за различий в округлении,
Я нашел рецепт здесь .
Ключевыми методами кажутся 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 , как указано на странице .)
Не уверен, что это помогает, но drawString (s, x, y)
устанавливает базовую линию текста в y.
Я был работал с вертикальным центрированием и не мог заставить текст выглядеть правильно, пока не заметил это поведение, упомянутое в документах. Я предполагал, что нижняя часть шрифта находится на y.
Для меня исправление заключалось в вычитании fm.getDescent ()
из координаты y.