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

我在容器中有一个JLabel。 字体的默认大小非常小。 我希望JLabel的文本能够最大化。

我怎样才能做到这一点 ? 谢谢 :)

不是最漂亮的代码,但是下面的代码会为JLabel所谓的labelselect一个合适的字体大小,以使内部文本尽可能地适合内部,而不会溢出标签:

 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)); 

基本上,代码通过使用FontMetrics对象来查看JLabel的文本占用了多less空间,然后使用该信息确定可以使用的最大字体大小,而不会溢出JLabel的文本。

上面的代码可以插入JLabelJFramepaint方法中,或者当需要改变字体大小的时候调用一些方法。

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

替代文字img/growing-text.png

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

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

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

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

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

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

  1. 正如所写的,它实际上不断重新计算字体大小基于以前的字体大小的比例…因此,在几个调用后,它已经使字体大小太大。 (例如,以12点作为您的DESIGNED字体开始,将标签扩展1个像素,发布的代码将计算字体大小为12 *(比如说)1.2(字段空间与文本的比率)= 14.4或14点字体。另外1个像素和电话,你在16点!)。

因此,在重复调用设置(例如, ComponentResizedListener或自定义/修改的LayoutManager )中使用它是不合适的(没有适应)。

列出的代码实际上假定起始大小为10磅,但是指的是当前字体大小,因此适合调用一次(在创build标签时设置字体的大小)。 如果它是int newFontSize = (int) (widthRatio * 10); 而不是int newFontSize = (int)(labelFont.getSize() * widthRatio);

  1. 因为它使用new Font(labelFont.getName(), Font.PLAIN, fontSizeToUse))来生成新的字体,不支持更新的字体中原始字体的Bolding,Italic或Color等。 如果它使用labelFont.deriveFont来代替它会更灵活。

  2. 该解决scheme不支持HTML标签文本。 (我知道这可能不是所提供的答案代码的预期结果,但由于我在我的JPanel上有一个HTML文本JLabel ,我正式发现了这个限制, FontMetrics.stringWidth()计算文本的长度, 包括宽度的html标签 – 即只是更多的文字)

我build议寻找这个SO问题的答案,在这个问题中 ,垃圾回答的答案指向了几个不同的答案(包括这个答案)到一个几乎相同的问题。 在这个页面上,我将提供一个额外的答案,以30-100倍的速度加快其他答案之一。