Как изменить размер шрифта JLabel, чтобы взять максимальный размер - PullRequest
62 голосов
/ 26 апреля 2010

У меня есть JLabel в контейнере. Размер шрифта по умолчанию очень маленький. Я бы хотел, чтобы текст JLabel имел максимальный размер.

Как я могу это сделать?

Ответы [ 5 ]

107 голосов
/ 26 апреля 2010
label = new JLabel("A label");
label.setFont(new Font("Serif", Font.PLAIN, 14));

взято из Как использовать HTML в компонентах Swing

69 голосов
/ 26 апреля 2010

Не самый красивый код, но следующий код подберет подходящий размер шрифта для JLabel, называемого label, чтобы текст внутри как можно больше подходил к внутренней части, не переполняя метку:

Font labelFont = label.getFont();
String labelText = label.getText();

int stringWidth = label.getFontMetrics(labelFont).stringWidth(labelText);
int componentWidth = label.getWidth();

// Find out how much the font can grow in width.
double widthRatio = (double)componentWidth / (double)stringWidth;

int newFontSize = (int)(labelFont.getSize() * widthRatio);
int componentHeight = label.getHeight();

// Pick a new font size so it will not be larger than the height of label.
int fontSizeToUse = Math.min(newFontSize, componentHeight);

// Set the label's font size to the newly determined size.
label.setFont(new Font(labelFont.getName(), Font.PLAIN, fontSizeToUse));

В основном код проверяет, сколько места занимает текст в JLabel, используя объект FontMetrics, а затем использует эту информацию для определения наибольшего размер шрифта, который можно использовать без переполнения текста из JLabel.

Приведенный выше код может быть вставлен, возможно, в метод paint JFrame, который содержит JLabel, или в некоторый метод, который будет вызываться, когда необходимо изменить размер шрифта.

Ниже приведен скриншот приведенного выше кода в действии:

альтернативный текст http://coobird.net/img/growing-text.png

9 голосов
/ 31 августа 2014
 JLabel textLabel = new JLabel("<html><span style='font-size:20px'>"+Text+"</span></html>");
2 голосов
/ 19 марта 2015

Исходный код для метки - Как изменить цвет и шрифт (в Netbeans)

jLabel1.setFont(new Font("Serif", Font.BOLD, 12));


jLabel1.setForeground(Color.GREEN);
1 голос
/ 09 июня 2015

Просто хотел отметить, что принятый ответ имеет пару ограничений (которые я обнаружил, когда пытался его использовать)

  1. Как написано, он фактически продолжает пересчитывать размер шрифта, основываясь на соотношении предыдущего размера шрифта ... таким образом, после всего лишь нескольких вызовов он визуализировал размер шрифта слишком большой. (Например, начните с 12 точки в качестве вашего ПРОЕКТИРОВАННОГО шрифта, увеличьте метку всего на 1 пиксель, и опубликованный код вычислит размер шрифта как 12 * (скажем) 1,2 (отношение пространства поля к тексту) = 14,4 или 14 точечных шрифтов. Еще 1 пиксель и колл, и вы на 16 месте!).

Таким образом, он не подходит (без адаптации) для использования в настройке повторного вызова (например, ComponentResizedListener или пользовательской / измененной LayoutManager).

Перечисленный код эффективно принимает начальный размер 10 пт, но относится к текущему размеру шрифта и поэтому подходит для однократного вызова (для установки размера шрифта при создании метки). Это будет работать лучше в среде с несколькими вызовами, если он будет int newFontSize = (int) (widthRatio * 10);, а не int newFontSize = (int)(labelFont.getSize() * widthRatio);

  1. Поскольку для генерации нового шрифта используется new Font(labelFont.getName(), Font.PLAIN, fontSizeToUse)), отсутствует поддержка жирного шрифта, курсива, цвета и т. Д. Из исходного шрифта в обновленном шрифте. Было бы более гибко, если бы вместо этого использовалось labelFont.deriveFont.

  2. Решение не обеспечивает поддержку HTML-метки Text. (Я знаю, что это, вероятно, никогда не было ожидаемым результатом предложенного кода ответа, но, поскольку у меня был JLabel текст HTML на моем JPanel, я официально обнаружил ограничение. FontMetrics.stringWidth() вычисляет длину текста как включительно ширины тегов html - т.е. просто больше текста)

Я рекомендую посмотреть на ответ на этот вопрос SO , где ответ trashgod указывает на несколько разных ответов (включая этот) на почти идентичный вопрос. На этой странице я предоставлю дополнительный ответ, который ускоряет один из других ответов в 30-100 раз.

...