Полное обоснование с заменой Java Graphics.drawString?
Вопрос
Кто-нибудь знает существующий код, который позволяет рисовать полностью выровненный текст в Java2D?
Например, если бы я сказал: drawString("sample text here", x, y, width)
, существует ли существующая библиотека, которая могла бы определить, какая часть этого текста умещается в пределах ширины, сделать некоторое расстояние между символами, чтобы текст выглядел хорошо, и автоматически выполнить базовый перенос слов?
Решение
Хотя это и не самое элегантное и надежное решение, вот метод, который позволит Font
нынешнего Graphics
объект и получить его FontMetrics
чтобы узнать, где рисовать текст и при необходимости перейти на новую строку:
public void drawString(Graphics g, String s, int x, int y, int width)
{
// FontMetrics gives us information about the width,
// height, etc. of the current Graphics object's Font.
FontMetrics fm = g.getFontMetrics();
int lineHeight = fm.getHeight();
int curX = x;
int curY = y;
String[] words = s.split(" ");
for (String word : words)
{
// Find out thw width of the word.
int wordWidth = fm.stringWidth(word + " ");
// If text exceeds the width, then move to next line.
if (curX + wordWidth >= x + width)
{
curY += lineHeight;
curX = x;
}
g.drawString(word, curX, curY);
// Move over to the right for next word.
curX += wordWidth;
}
}
Эта реализация будет отделять заданные String
в массив String
с помощью split
метод с пробелом в качестве единственного разделителя слов, поэтому он, вероятно, не очень надежен.Он также предполагает, что за словом следует пробел, и действует соответствующим образом при перемещении курсора. curX
позиция.
На вашем месте я бы не рекомендовал использовать эту реализацию, но, вероятно, функции, необходимые для создания другой реализации, все равно будут использовать методы, предоставляемые FontMetrics
сорт.
Другие советы
Для переноса слов вас может заинтересовать Как вывести строку в несколько строк с помощью графики.Здесь нет оправданий, не уверен, легко (или невозможно!) Добавить...