Мой цикл 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);
Другие вопросы по тегам