У меня есть JLabel
в контейнере. Размер шрифта по умолчанию очень маленький. Я бы хотел, чтобы текст JLabel
занимал максимальный размер.
Как я могу это сделать?
У меня есть JLabel
в контейнере. Размер шрифта по умолчанию очень маленький. Я бы хотел, чтобы текст JLabel
занимал максимальный размер.
Как я могу это сделать?
Не самый красивый код, но следующий код подберет подходящий размер шрифта для 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 font size to the newly determined size.
label.setFont(new Font(labelFont.getName(), Font.PLAIN, fontSizeToUse));
В основном код JLabel
занимает текст в JLabel
, используя объект FontMetrics
, а затем использует эту информацию, чтобы определить наибольший размер шрифта, который можно использовать, не переполняя текст из JLabel
.
Приведенный выше код может быть вставлен, возможно, paint
методом в JFrame
, который удерживает JLabel
, или какой - то метод, который будет вызываться, когда размер шрифта должен быть изменен.
Ниже приведен скриншот приведенного выше кода в действии:
(источник: coobird.net)
label = new JLabel("A label");
label.setFont(new Font("Serif", Font.PLAIN, 14));
JLabel textLabel = new JLabel("<html><span style='font-size:20px'>"+Text+"</span></html>");
Исходный код для ярлыка - Как изменить цвет и шрифт (в Netbeans)
jLabel1.setFont(new Font("Serif", Font.BOLD, 12));
jLabel1.setForeground(Color.GREEN);
Просто хотел указать, что принятый ответ имеет пару ограничений (которые я обнаружил, когда я пытался его использовать)
Таким образом, он не подходит (без адаптации) для использования в настройке повторного вызова (например, ComponentResizedListener
или пользовательский/измененный LayoutManager
).
Перечисленный код эффективно принимает начальный размер 10 pt, но относится к текущему размеру шрифта и поэтому подходит для вызова один раз (чтобы установить размер шрифта при создании метки). Он работал бы лучше в среде с несколькими вызовами, если бы он int newFontSize = (int) (widthRatio * 10);
, а не int newFontSize = (int)(labelFont.getSize() * widthRatio);
Поскольку для создания нового шрифта он использует new Font(labelFont.getName(), Font.PLAIN, fontSizeToUse))
, у него нет поддержки для Bolding, Italic или Color и т.д. из исходного шрифта в обновленном шрифте. Было бы более гибким, если бы вместо этого использовалось labelFont.deriveFont
.
Решение не поддерживает HTML-метку Text. (Я знаю, что, вероятно, не был намеченным результатом предложенного кода ответа, но поскольку у меня был HTML-текст JLabel
на моем JPanel
, я официально открыл ограничение. FontMetrics.stringWidth()
вычисляет длину текста как включительно ширины html-тегов, т.е. как просто больше текста)
Я рекомендую посмотреть ответ на этот вопрос SO, где ответ trashgod указывает на несколько разных ответов (включая этот) на почти идентичный вопрос. На этой странице я дам дополнительный ответ, который ускоряет один из других ответов в 30-100 раз.