Мой цикл while для определения подходящего размера шрифта заходит слишком далеко... иногда?
Я делаю проект для школы, который требует, чтобы я прочитал файл и сделал гистограмму с прочитанными данными. Я создал класс, который создает JFrame и рисует прямоугольники, чтобы разделить фрейм на раздел для имени каждого из данных (имя футболиста) и один для столбцов (возраст игрока). У меня есть метод, который предназначен для увеличения размера шрифта до тех пор, пока самая длинная (напечатанная) строка не займет ширину, выделенную для пространства, и не вернет шрифт того размера, который будет использоваться в методе рисования.
Он работает при создании исходного 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:
Демариус Томас
длина 150
допустимая ширина 158
17
Демариус Томас
длина 170
допустимая ширина 158
18
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);