5 ответов:
не самый красивый код, но ниже будет выбрать подходящий размер шрифта для
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, или какой-то метод, который будет вызван, когда размер шрифта должен быть изменен.ниже приведен скриншот вышеуказанного кода в действии:
label = new JLabel("A label"); label.setFont(new Font("Serif", Font.PLAIN, 14));принято от Как использовать HTML в компонентах Swing
исходный код этикетки-как изменить цвет и шрифт (в Netbeans)
jLabel1.setFont(new Font("Serif", Font.BOLD, 12)); jLabel1.setForeground(Color.GREEN);
просто хотел отметить, что принятый ответ имеет несколько ограничений (которые я обнаружил, когда пытался его использовать)
- как написано, он фактически продолжает пересчитывать размер шрифта на основе соотношения размер шрифта... таким образом, после всего лишь нескольких вызовов он сделал размер шрифта слишком большим. (например, начните с 12 точки в качестве разработанного шрифта, разверните метку всего на 1 пиксель, и опубликованный код будет вычислите размер шрифта как 12 * (скажем) 1.2 (отношение пространства поля к тексту) = 14.4 или 14 точечный шрифт. Еще 1 пиксель и вызов, и вы находитесь в 16 точке !).
таким образом, он не подходит (без адаптации) для использования в настройке повторного вызова (например, a
ComponentResizedListenerили пользовательские/измененLayoutManager).приведенный код фактически предполагает начальный размер 10 pt, но относится к текущему размеру шрифта и, таким образом, подходит для вызова один раз (чтобы установить размер шрифта, когда создается метка). Это было бы лучше работать в среде с несколькими вызовами, если бы это было
int newFontSize = (int) (widthRatio * 10);, а неint newFontSize = (int)(labelFont.getSize() * widthRatio);
потому что он использует
new Font(labelFont.getName(), Font.PLAIN, fontSizeToUse))чтобы создать новый шрифт, нет поддержки полужирного, курсивного или цветного и т. д. Из исходного шрифта в обновленном шрифте. Было бы более гибким, если бы он использовалlabelFont.deriveFontвместо.решение не обеспечивает поддержку текста HTML-метки. (Я знаю, что это, вероятно, никогда не было предполагаемый результат предложенного кода ответа, но так как у меня был HTML-текст
JLabelнаJPanelЯ формально обнаружил ограничение. ЭлементFontMetrics.stringWidth()вычисляет длину текста как включительно ширины html тегов-т. е. как просто больше текста)рекомендую посмотреть на ответ это так вопрос где ответ trashgod указывает на ряд различных ответов (включая этот) на почти идентичный вопрос. На этом страница я предоставлю дополнительный ответ, который ускоряет один из других ответов в 30-100 раз.
Comments