我有JLabel
一个容器。字体的默认大小非常小。我希望 的文本JLabel
采用最大尺寸。
我怎样才能做到这一点?
label = new JLabel("A label");
label.setFont(new Font("Serif", Font.PLAIN, 14));
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
以下是上述代码的截图:
(来源:coobird.net)
JLabel textLabel = new JLabel("<html><span style='font-size:20px'>"+Text+"</span></html>");
JLabel label = new JLabel("Hello World");
label.setFont(new Font("Calibri", Font.BOLD, 20));
标签的源代码 - 如何更改颜色和字体(在 Netbeans 中)
jLabel1.setFont(new Font("Serif", Font.BOLD, 12));
jLabel1.setForeground(Color.GREEN);
只是想指出接受的答案有几个限制(我在尝试使用它时发现)
因此,它不适合(没有调整)用于重复呼叫设置(例如ComponentResizedListener
,a 或 custom/modified 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 标签的宽度 - 即只是更多的文字)
我建议查看这个 SO question的答案,其中垃圾神的答案指向一个几乎相同的问题的许多不同答案(包括这个答案)。在该页面上,我将提供一个额外的答案,它将其他答案之一的速度提高 30-100 倍。
我试过这对我有用:
Label welcomeMsg = new JLabel("Contact us");
welcomeMsg.setBounds(200,10,100,25);
welcomeMsg.setFont( new Font("Serif",Font.PLAIN,22));