我正在为学校做一个项目,要求我阅读一个文件并制作一个带有数据读取的条形图。我制作了一个制作JFrame并绘制矩形的类,将框架划分为每个数据名称(足球运动员名称)和一个条形(球员年龄)的区域。我有一个方法,旨在增加字体大小,直到最长(打印)的字符串占用分配空间的宽度,并返回该大小的字体,以在paint方法中使用。
它在创建初始JFrame时有效,但是当我调整它的大小时,它有时会将字体大小增加到1,但并非总是如此。我很茫然。控制台输出显示(对我来说)我的while循环的条件不满足,但字体大小仍然增加...任何洞察将非常感激。谢谢!
private Font myFont(int allowedW, int allowedH, int numData) {
// needs to check length of font and size of JFrame and set font (size)
// accordingly
String longest = "";
int fontSize = 1;
Font f = new Font("SansSerif", Font.BOLD, fontSize);
for (BarData b : this.graphData) {
if (getFontMetrics(f).stringWidth(b.getName()) > getFontMetrics(f)
.stringWidth(longest)) {
longest = b.getName();
}
}
while ((getFontMetrics(f).stringWidth(longest) < allowedW)){
//&& ((getFontMetrics(f).getHeight() * numData) < allowedH)) {
f = new Font("SansSerif", Font.BOLD, fontSize);
System.out.println(longest);
System.out.println("length " + getFontMetrics(f).stringWidth(longest));
System.out.println("allowed width " + allowedW);
System.out.println(fontSize);
fontSize++;
}
return f;
}
当我拖动以调整jframe的大小时,输出看起来像这样:
Demaryius Thomas
长度150
允许宽度158
17个
Demaryius Thomas
长度170
允许宽度158
18
答案 0 :(得分:1)
像这样改变你的while循环,
while ((getFontMetrics(f).stringWidth(longest) < allowedW)){
//&& ((getFontMetrics(f).getHeight() * numData) < allowedH)) {
System.out.println(longest);
System.out.println("length " + getFontMetrics(f).stringWidth(longest));
System.out.println("allowed width " + allowedW);
System.out.println(fontSize);
fontSize++;
f = new Font("SansSerif", Font.BOLD, fontSize);//your f is not updated after increasing fontSize, if you put it as first statement.
}
return new Font("SansSerif", Font.BOLD, fontSize - 1);