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中)
我只是想指出,公认的答案有几个局限性(这是我在尝试使用它时发现的)
组件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));