我的容器中有一个
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
,或自定义/修改的 LayoutManager
)。
列出的代码实际上假定起始大小为 10 pt,但指的是当前字体大小,因此适合调用一次(在创建标签时设置字体大小)。 如果它是
int newFontSize = (int) (widthRatio * 10);
而不是 int newFontSize = (int)(labelFont.getSize() * widthRatio);
,那么在多调用环境中效果会更好
因为它使用
new Font(labelFont.getName(), Font.PLAIN, fontSizeToUse))
来生成新字体,所以更新后的字体中不支持原始字体的粗体、斜体或颜色等。 如果用labelFont.deriveFont
来代替会更灵活。 该解决方案不提供对 HTML 标签文本的支持。 (我知道这可能不是所提供的答案代码的预期结果,但由于我的
JLabel
上有一个 HTML 文本 JPanel
,我正式发现了限制。FontMetrics.stringWidth()
将文本长度计算为 包括在内 html 标签的宽度 - 即只是更多文本)我建议查看这个SO问题的答案,其中trashgod的答案指向一个几乎相同的问题的许多不同答案(包括这个)。 在该页面上,我将提供一个额外的答案,可以将其他答案之一的速度提高 30-100 倍。
我尝试过这对我有用:
Label welcomeMsg = new JLabel("Contact us");
welcomeMsg.setBounds(200,10,100,25);
welcomeMsg.setFont( new Font("Serif",Font.PLAIN,22));
我制作的这个方法解决了该线程上最流行的解决方案的所有问题(我认为)。如果您使用其他 html 命令(我只使用 center),您也可以在拆分字符串之前将它们从字符串中删除。如果您希望这对 JButton 起作用,只需将参数更改为 JButton 即可。你可以把这个方法放在中继器中,不断更新字体,就可以了。
public void maxFont(JLabel label){
String sin = label.getText();
String[] ss = sin.replace("<html>","").replace("<center>", "").split("<br>");
int lines = ss.length;
String s="";
FontMetrics fm = getFontMetrics(new JLabel().getFont());
int maxWidth=0;
if(!sin.equals(ss[0])){
for (String sss : ss) {
int p = fm.stringWidth(sss);
if(p>maxWidth){
maxWidth=p;
s=sss;
}
}
}else {
s=sin;
maxWidth=fm.stringWidth(s);
}
int newWidth = (label.getWidth()/maxWidth)*10;
int maxHeight = label.getHeight()*7/8/lines;
int fontSize = Math.min(newWidth,maxHeight);
label.setFont(new Font(label.getFont().getName(), Font.PLAIN, fontSize));
}