我有JLabel
一个容器。字体的默认大小非常小。我想要的是JLabel
采用最大尺寸。
我怎样才能做到这一点?
我有JLabel
一个容器。字体的默认大小非常小。我想要的是JLabel
采用最大尺寸。
我怎样才能做到这一点?
Answers:
不是最漂亮的代码,但是以下代码将为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)
label.getHeight()
间接记录为使用像素单位,同时font.getSize()
以点为单位返回值。可能componentHeight
需要使用label.getHeight() * PPI / dpi
,这样Math.min
的回报点,而不是像素,在这两种情况下?
label = new JLabel("A label");
label.setFont(new Font("Serif", Font.PLAIN, 14));
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);
只是想指出接受的答案有两个限制(我在尝试使用它时就发现了)
因此,它不适合(没有适应性)用于重复通话设置(例如ComponentResizedListener
,或自定义/修改的LayoutManager
)。
列出的代码有效地假定起始大小为10 pt,但引用当前字体大小,因此适合于调用一次(在创建标签时设置字体大小)。它会在多呼叫环境中工作更好,如果它确实int newFontSize = (int) (widthRatio * 10);
不是int newFontSize = (int)(labelFont.getSize() * widthRatio);
因为它用于new Font(labelFont.getName(), Font.PLAIN, fontSizeToUse))
生成新字体,所以不支持更新字体中原始字体的粗体,斜体或颜色等。如果使用labelFont.deriveFont
代替它会更灵活。
该解决方案不提供对HTML标签文本的支持。(我知道这可能永远不会是所提供答案代码的预期结果,但是由于我上面有HTML文本JLabel
,因此我JPanel
正式发现了限制。该方法FontMetrics.stringWidth()
计算的文本长度包括html标签的宽度-即只是更多文字)
我建议看一下这个SO问题的答案,其中垃圾神的答案指向几乎相同的问题的多个不同答案(包括这个答案)。在该页面上,我将提供一个额外的答案,将另一个答案的速度提高30-100倍。
JLabel label = new JLabel("Hello World");
label.setFont(new Font("Calibri", Font.BOLD, 20));