如何更改 JLabel 的字体大小以获取最大尺寸

问题描述 投票:0回答:8

我的容器中有一个

JLabel
。 字体的默认大小非常小。 我希望
JLabel
的文本采用最大尺寸。

我该怎么做?

java fonts size containers jlabel
8个回答
125
投票
label = new JLabel("A label");
label.setFont(new Font("Serif", Font.PLAIN, 14));

取自如何在 Swing 组件中使用 HTML


90
投票

不是最漂亮的代码,但下面的代码将为

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
方法中,或者在需要更改字体大小时调用的某个方法。

以下是上述代码的运行截图:

alt text
(来源:coobird.net


10
投票
 JLabel textLabel = new JLabel("<html><span style='font-size:20px'>"+Text+"</span></html>");

7
投票
JLabel label = new JLabel("Hello World");
label.setFont(new Font("Calibri", Font.BOLD, 20));

4
投票

标签源代码 - 如何更改颜色和字体(在 Netbeans 中)

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


jLabel1.setForeground(Color.GREEN);

2
投票

只是想指出,接受的答案有一些限制(我在尝试使用它时发现)

  1. 如所写,它实际上不断根据前一个字体大小的比例重新计算字体大小......因此,在几次调用之后,它就将字体大小渲染得太大了。 (例如,从 12 点作为您的设计字体开始,仅将标签扩展 1 像素,发布的代码将计算字体大小为 12 *(比如说)1.2(字段空间与文本的比率)= 14.4 或 14 点字体。再多 1 个 Pixel 并跟注,您就处于 16 点!)。

因此,它不适合(无需调整)用于重复调用设置(例如

ComponentResizedListener
,或自定义/修改的
LayoutManager
)。

列出的代码实际上假定起始大小为 10 pt,但指的是当前字体大小,因此适合调用一次(在创建标签时设置字体大小)。 如果它是

int newFontSize = (int) (widthRatio * 10);
而不是
int newFontSize = (int)(labelFont.getSize() * widthRatio);

,那么在多调用环境中效果会更好
  1. 因为它使用

    new Font(labelFont.getName(), Font.PLAIN, fontSizeToUse))
    来生成新字体,所以更新后的字体中不支持原始字体的粗体、斜体或颜色等。 如果用
    labelFont.deriveFont
    来代替会更灵活。

  2. 该解决方案不提供对 HTML 标签文本的支持。 (我知道这可能不是所提供的答案代码的预期结果,但由于我的

    JLabel
    上有一个 HTML 文本
    JPanel
    ,我正式发现了限制。
    FontMetrics.stringWidth()
    将文本长度计算为 包括在内 html 标签的宽度 - 即只是更多文本)

我建议查看这个SO问题的答案,其中trashgod的答案指向一个几乎相同的问题的许多不同答案(包括这个)。 在该页面上,我将提供一个额外的答案,可以将其他答案之一的速度提高 30-100 倍。


0
投票

我尝试过这对我有用:

Label welcomeMsg = new JLabel("Contact us");

welcomeMsg.setBounds(200,10,100,25);

welcomeMsg.setFont( new Font("Serif",Font.PLAIN,22));

0
投票

我制作的这个方法解决了该线程上最流行的解决方案的所有问题(我认为)。如果您使用其他 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));
}
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.