Java 如何更改JLabel字体的大小以获得最大大小

Java 如何更改JLabel字体的大小以获得最大大小,java,fonts,size,containers,jlabel,Java,Fonts,Size,Containers,Jlabel,我在一个容器中有一个JLabel。 字体的大小非常小。 我希望JLabel的文本采用最大大小 我该怎么做 label = new JLabel("A label"); label.setFont(new Font("Serif", Font.PLAIN, 14)); 摘自并非最漂亮的代码,但以下内容将为名为label的JLabel选择合适的字体大小,以便内部文本尽可能适合内部,而不会溢出标签: Font labelFont = label.getFont(); String labelText

我在一个容器中有一个
JLabel
。 字体的大小非常小。 我希望
JLabel
的文本采用最大大小

我该怎么做

label = new JLabel("A label");
label.setFont(new Font("Serif", Font.PLAIN, 14));

摘自并非最漂亮的代码,但以下内容将为名为
label
JLabel
选择合适的字体大小,以便内部文本尽可能适合内部,而不会溢出标签:

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
中的文本溢出

上述代码可以插入到保存
JLabel
JFrame
paint
方法中,或者在需要更改字体大小时调用的某个方法中

以下是上述代码的屏幕截图:


(来源:)

JLabel textlab=newjlabel(“+Text+”);

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


我只是想指出,公认的答案有几个局限性(这是我在尝试使用它时发现的)

  • 如前所述,它实际上一直在根据前一个字体大小的比率重新计算字体大小。。。因此,在几次调用之后,它将字体大小渲染为太大。(例如,以12点作为设计字体开始,将标签仅扩展1个像素,发布的代码将计算字体大小为12*(例如)1.2(字段空间与文本的比率)=14.4或14点字体。再增加1个像素并调用,您就达到了16点!)
  • 因此,它不适合(无自适应)在重复调用设置中使用(例如
    组件ResistizedListener
    ,或自定义/修改的
    布局管理器

    所列代码有效地假设起始大小为10磅,但指的是当前字体大小,因此适合调用一次(在创建标签时设置字体大小)。如果它能够
    intnewfontsize=(int)(widthRatio*10),那么它在多调用环境中工作得更好而不是
    intnewfontsize=(int)(labelFont.getSize()*widthRatio)

  • 由于它使用
    新字体(labelFont.getName(),Font.PLAIN,fontSizeToUse))
    生成新字体,因此不支持更新字体中原始字体的粗体、斜体或彩色等。如果使用
    labelFont.deriveFont
    ,它将更加灵活

  • 该解决方案不支持HTML标签文本。(我知道这可能从来都不是答案代码提供的预期结果,但由于我的
    JPanel
    上有一个HTML文本
    JLabel
    ,我正式发现了这个局限性。
    FontMetrics.stringWidth()
    将文本长度计算为HTML标记宽度的包括在内的,即更多文本)


  • 我建议看一下垃圾神的答案,垃圾神的答案指向一个几乎相同的问题的许多不同答案(包括这一个)。在这一页上,我将提供一个额外的答案,使其他答案的速度提高30-100倍。

    @animatrix30:你的问题没有多大意义。您希望水平尺寸还是垂直尺寸与JLabel的尺寸匹配(或两者都匹配)?这是否需要自动化:也就是说,如果您决定使JLabel(比如)更宽,字体是否应该自动增长?你为什么要这么做?这是一个不寻常的要求。你想实现什么?显示大字体?或者根据组件大小重新调整字体大小?我的容器只有一个元素:JLabel。通过德法特,杰拉贝尔占据了所有的位置。但是,字体大小非常小。我想,字体大小将是最大的,以有较少的“白色”可能@戒指持有人我希望这款Jlabel拥有尽可能大的字体我希望你已经理解我试图解释的内容:)@wizardofods字体是否自动增长:是的,正是我想要的。我这样做是因为我的申请是为残疾人准备的,这个问题很有道理。我在这里使用它:你不能真的这么做。在本例中,直到第一次绘制JLabel,字体才会存在。否则,如果您尝试以错误的初始化/调整大小/绘制顺序执行此操作,则会得到NPE。代码应为validate(),而不是paint(),因为更改字体会使触发调用paint()的组件无效,因此swing会使用大量cpu无休止地重新绘制组件。请注意
    label.getHeight()
    间接记录为使用像素单位,而
    font.getSize()
    以单位返回值。可能
    componentHeight
    需要使用
    label.getHeight()*PPI/dpi
    以便
    Math.min
    在这两种情况下都返回点,而不是像素?Falemnderit@Bekim Fetajion不鼓励代码回答。如果您添加一些关于如何解决问题的描述,那就太好了。
    JLabel label = new JLabel("Hello World");
    label.setFont(new Font("Calibri", Font.BOLD, 20));
    
    jLabel1.setFont(new Font("Serif", Font.BOLD, 12));
    
    
    jLabel1.setForeground(Color.GREEN);
    
    JLabel label = new JLabel("Hello World");
    label.setFont(new Font("Calibri", Font.BOLD, 20));