Изменить размер шрифта в зависимости от длины строки - PullRequest
2 голосов
/ 17 августа 2011

Из XML-файла мне даны ширина, высота и идентификатор.Все они могут меняться очень быстро.Теперь меня просят нарисовать прямоугольник, используя ширину и высоту (простая задача), и поместить идентификатор в его центр.Идентификатор не должен выходить за пределы прямоугольника, в котором он находится.

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

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

[Редактировать]: я использую класс Graphics 2D для рисования всего.

Ответы [ 3 ]

2 голосов
/ 17 августа 2011
  1. Начните с выбора Font в предпочитаемом (т. Е. Максимальном) размере.
  2. Возьмите FontRenderContext из объекта Graphics2D, используя getFontRenderContext.
  3. Используйте getStringBounds() на Font, который должен быть визуализирован, чтобы получить объект Rectangle2D для конкретного String, который должен быть визуализирован.Этот объект описывает окончательный размер String, используя этот Font
  4. Проверьте, достаточно ли мал размер, указанный этим Rectangle2D.
    4a.Если он достаточно маленький, все готово.Используйте последний Font, который вы проверили.
    4b.Если он слишком большой, используйте Font.derive(), чтобы создать уменьшенную версию Font, продолжайте использовать его и вернитесь к 3.
1 голос
/ 17 августа 2011

У вас нет времени, чтобы дать вам полный рабочий пример, но вот пара советов, которые должны привести вас в правильном направлении.Графический объект, который вы используете для рисования, имеет метод getFontMetrics (), один из методов в FontMetrics - это stringWidth (String str), который дает вам ширину строки в текущем шрифте.

Если ширинаслишком велик для вашего прямоугольника. Установите для шрифта объекта Graphics тот же шрифт с меньшим размером до тех пор, пока он не уместится.

Для горизонтального центрирования строки в контейнере (давно изучено в классе набора текста в средней школе)):

(rectangleWidth / 2) - (stringWidth / 2)

http://download.oracle.com/javase/1.5.0/docs/api/java/awt/FontMetrics.html

Чтобы создать шрифт меньшего размера, например:

Font font = graphics.getFont();
Font smallerFont = font.derive(font.getSize() - 1);
graphics.setFont(smallerFont);

Надеюсь, это поможет вам двигаться в правильном направлении.

0 голосов
/ 17 августа 2011

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

Пример: если ширина каждого символа составляет 12 пикселей, а у вас есть 10 символов в вашем идентификаторе, то вам нужно 120 пикселей, чтобы соответствоватьвсе в. Если у вас есть только 80px доступны, это просто математика 80/10 = размер шрифта 8px (уменьшите половину пикселя для заполнения, если хотите.

Просто мое предложение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...