Java 我的while循环用于确定合适的字体大小太过分了。。。有时

Java 我的while循环用于确定合适的字体大小太过分了。。。有时,java,while-loop,fonts,jframe,fontmetrics,Java,While Loop,Fonts,Jframe,Fontmetrics,我正在为学校做一个项目,要求我读取一个文件,并用读取的数据制作一个条形图。我制作了一个类,它制作一个JFrame并绘制矩形,将框架划分为一个部分,用于每个数据的名称(足球运动员的姓名)和一个小节(球员的年龄)。我有一个方法,就是增加字体大小,直到最长的(打印的)字符串占据分配的空间宽度,然后返回一个该大小的字体以用于绘制方法 它在创建初始JFrame时起作用,但当我调整它的大小时,它有时会将字体大小1增大到较大,但并不总是如此。我不知所措。控制台输出显示(对我来说)我的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;
}
私有字体myFont(int-allowedW、int-allowedH、int-numData){
//需要检查字体长度和JFrame的大小,并设置字体(大小)
//相应地
字符串最长=”;
int fontSize=1;
Font f=新字体(“SansSerif”,Font.BOLD,fontSize);
for(BarData b:这个。graphData){
如果(getFontMetrics(f).stringWidth(b.getName())>getFontMetrics(f)
.stringWidth(最长)){
最长=b.getName();
}
}
while((getFontMetrics(f).stringWidth(最长)<允许宽度)){
//&&((getFontMetrics(f.getHeight()*numData)
当我拖动以调整jframe的大小时,输出如下所示:

德马吕斯·托马斯
长度150
允许宽度158
17
德马吕斯·托马斯
长度170
允许宽度158

18

像这样改变你的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);
while((getFontMetrics(f).stringWidth(最长)
返回的
f
不是小于
允许的最大字体大小w
,而是下一个,可能太大了。您的代码总是返回比允许的字体大一个大小的字体。在while循环之后,创建一个大小为
fontSize-1
的字体对象并返回该字体。我已尝试添加f=new Font(“SansSerif”,Font.BOLD,fontSize-1);在while循环之后,但它不会改变任何东西…为了更快地获得更好的帮助,发布一个or.BTW-
新字体(“SansSerif”,Font.BOLD,fontSize)
使用常量进行编译时检查。即
新字体(Font.SANS_SERIF,Font.BOLD,fontSize)
这是编写循环的更好方法,但它仍然返回一个过大的字体。是的,但是您的返回语句应该是这样的,返回新字体(“SansSerif”,font.BOLD,fontSize-1);在您以前的代码中它将不起作用,但现在它应该起作用。