为什么我的标签不沿y轴居中? (斯坦福SEE CS106A)

时间:2012-03-31 18:02:29

标签: java graphics alignment acm-java-libraries

我正在尝试使用斯坦福大学的在线CS106A课程学习java。该课程使用http://jtf.acm.org/

中的acm库包

有谁可以告诉我为什么我的代码不会沿着y轴居中?

import acm.program.*;
import acm.graphics.*;

public class CenterLabel extends GraphicsProgram {
    public void run() {
        GLabel text = new GLabel("HELLO!");
        text.setFont("Arial-200");
        double cy = (getHeight() / 2) + (text.getAscent() / 2);
        text.setLocation(0, cy);
        add(text);
    }
}

当我运行此程序时,我得到了这个:http://i.imgur.com/rriSX.jpg

修改 令我不安的另一件事是,在赋值中运行的样本似乎也具有相同的对齐问题。 (见下面的链接,Ex3)

http://see.stanford.edu/materials/icspmcs106a/13-assignment-2-simple-java.pdf

如果仔细观察图片,可以看到课堂内的标签也没有正确居中?

2 个答案:

答案 0 :(得分:1)

您可以使用setBounds方法将标签定位到所需位置。它需要四个int参数。 e.g:

text.setBounds(20,20,20,20);

答案 1 :(得分:0)

编辑:哦,亲爱的,我在测试时错误输入了您的代码!我不小心减去了两个值,而不是添加它们。 getAscent()返回一个负数,表示文本提升的基线上方有多少像素,因此该位置的正确公式为

double cy = (getHeight() / 2) - (text.getAscent() / 2);

逻辑是一样的,但getAscent()为负的事实意味着你必须翻转标志。对不起!


在CS106A中,我们通常不会将Java程序精确地作为applet运行,因为默认的applet viewer会错误地获取窗口的尺寸(即调用getWidth()getHeight()将产生不正确的结果) 。如果从CS106A网站下载 Stanford Eclipse ,您将获得一个Eclipse插件,可以运行您作为独立应用程序编写的Java程序。发生这种情况时,窗口大小和形状实际上是正确的,因此getWidth()getHeight()将报告正确的值。

或者,请考虑将以下代码添加到您的程序中:

public static void main(String[] args) {
    new /* name of your class */.start(args);
}

然后,您可以直接将程序作为Java应用程序而不是applet运行,并且应该解决此问题。

希望这有帮助!