如何更改JLabel字体的大小以采用最大大小


75

我有JLabel一个容器。字体的默认大小非常小。我想要的是JLabel采用最大尺寸。

我怎样才能做到这一点?


1
@ animatrix30:您的问题没有多大意义。您是否希望水平尺寸或垂直尺寸与JLabel的尺寸(或两者)匹配?这是否需要自动化:也就是说,如果您决定使JLabel变宽,字体是否应该自动增长?你为什么要这么做?这是一个不常见的请求。
SyntaxT3rr0r 2010年

您想实现什么?显示大字体?或根据组件大小调整字体大小?
环形承载者2010年

我的Container juste有一个元素:JLabel。通过默认jlabel占据所有位置。但是,字体大小很小。我希望字体大小最大,以减少“白色”的可能性。@ring bearer我想要这个Jlabel尽可能大的字体,希望您理解我试图解释的内容:)
g123k 2010年

@WizardOfOdds字体应该自动增长:是的,正是我想要的。我这样做是因为我的应用程序适合残障人士
g123k 2010年

这个问题很合理。我在这里使用它:stackoverflow.com/a/4437998/11236
ripper234 2012年

Answers:


79

不是最漂亮的代码,但是以下代码将为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为止,字体才会存在。否则,如果尝试以错误的初始化/调整大小/绘制顺序执行此操作,则会得到NPE。
searchengine27 2015年

代码应该在validate()中,而不是paint()中,因为更改字体会使触发对paint()的调用的Component无效,因此swing使用许多cpu不断地重新绘制该组件。
Vouze

请注意,label.getHeight()间接记录为使用像素单位,同时font.getSize()点为单位返回值。可能componentHeight需要使用label.getHeight() * PPI / dpi,这样Math.min的回报点,而不是像素,在这两种情况下?
Dave Jarvis




1

只是想指出接受的答案有两个限制(我在尝试使用它时就发现了)

  1. 如所写,它实际上一直根据先前字体大小的比率重新计算字体大小...因此,在几次调用之后,它使字体大小变得太大。(例如,以12点作为您的设计字体,将标签扩展1个像素,发布的代码将计算出的字体大小为12 *(例如)1.2(字段与文本的空间比例)= 14.4或14点字体。再增加1个像素并致电,您现在处于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标签文本的支持。(我知道这可能永远不会是所提供答案代码的预期结果,但是由于我上面有HTML文本JLabel,因此我JPanel正式发现了限制。该方法FontMetrics.stringWidth()计算的文本长度包括html标签的宽度-即只是更多文字)

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


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

1
不建议使用代码答案。如果您添加一些有关如何解决问题的说明,那将是很棒的。
saeed foroughi
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.