Полное выравнивание с заменой Java Graphics.drawString? - PullRequest
6 голосов
/ 30 декабря 2008

Кто-нибудь знает о существующем коде, который позволяет вам рисовать полностью выровненный текст в Java2D?

Например, если я сказал, drawString("sample text here", x, y, width), существует ли существующая библиотека, которая могла бы определить, какая часть этого текста умещается в ширину, сделать некоторый межсимвольный интервал, чтобы текст выглядел хорошо, и автоматически выполнить основные перенос слов?

Ответы [ 2 ]

17 голосов
/ 30 декабря 2008

Хотя это не самое элегантное и надежное решение, вот метод, который будет принимать 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 классом .

1 голос
/ 30 декабря 2008

Для переноса слов вас может заинтересовать Как вывести строку в несколько строк, используя Graphics . Здесь нет оправдания, не уверен, легко ли (или невозможно!) Добавить ...

...