我试图将一个经常变化的句子放入一些jlabels中。我的3个jlabels的宽度始终保持不变。我正在做的是改变字体大小,以便所有字符都可以适应不超出标签的显示范围。我做的是在句子改变时调用下面的代码片段。
这是我的代码
String sentence = "Some long sentence";
int SentenceLength = sentence.length();
int FontSize = 0;
// sum of widths of the three labels
int TotalLblLength=lbl_0ValueInWords.getWidth()+lbl_1ValueInWords.getWidth()+lbl_1ValueInWords.getWidth();
/*decide the font size so that all the characters can be displayed
with out exceeding the display renge(horizontal) of the 3 labels
Inconsolata -> monopace font
font size == width of the font*2 (something I observed, not sure
if this is true always) */
FontSize=(TotalLblLength/SentenceLength)*2;
// max font size is 20 - based on label height
FontSize=(FontSize>20)?20:FontSize;
lbl_0ValueInWords.setFont(new java.awt.Font("Inconsolata", 0,FontSize));
lbl_1ValueInWords.setFont(new java.awt.Font("Inconsolata", 0,FontSize));
lbl_2ValueInWords.setFont(new java.awt.Font("Inconsolata", 0,FontSize));
int CharCount_lbl0 = width_lbl0 / (FontSize / 2);
int CharCount_lbl1 = width_lbl1 / (FontSize / 2);
int CharsCount_lbl2 = width_lbl2 / (FontSize / 2);
/*Set texts of each label
if sentence has more than the number of characters that can fit in the
1st label, excessive characters are moved to the 2nd label. same goes
for the 2nd and 3rd labels*/
if (SentenceLength > CharCount_lbl0) {
lbl_0ValueInWords.setText(sentence.substring(0, CharCount_lbl0));
if (SentenceLength > CharCount_lbl0 + CharCount_lbl1) {
lbl_1ValueInWords.setText(sentence.substring(CharCount_lbl0, CharCount_lbl0 + CharCount_lbl1));
lbl_2ValueInWords.setText(sentence.substring(CharCount_lbl0 + CharCount_lbl1, SentenceLength));
} else {
lbl_1ValueInWords.setText(sentence.substring(CharCount_lbl0, SentenceLength));
}
} else {
lbl_0ValueInWords.setText(sentence);
}
但即使重置字体大小后,有时最后一个字符也会超出显示范围。我已从jlabels中删除了可能导致此问题的边距。这适用于随机长度的句子。我可以通过减少用于计算的标签宽度来解决应用程序的问题(希望如此)
任何人都能解释一下原因吗?可能是因为字体对称性存在一些缺陷?
答案 0 :(得分:2)
没有字体对称这样的东西吗?
您正在处理的内容有两种类型的字体。等宽字体和非等宽字体。对于您可以键入的每个字符,等宽字体具有相同的精确宽度。其他人没有。
最重要的是,字体在不同的操作系统中的呈现方式不同。 Windows上的东西在Mac上会延长10-20%,因为它们会以不同的方式区分字体。
无论你想用JLabels做什么,停下来。您不应该使用3个JLabel来显示3行文本,因为它们不合适。废弃它们并使用JTextArea。它有文本换行,您可以设置字体,并删除边距/边框/填充并使其不可编辑。您可以非常轻松地对其进行自定义,因此它与JLabel无法区分,但它可以为您节省大量工作。
为正确的工作选择合适的工具。