我正在尝试使用斯坦福大学的在线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
如果仔细观察图片,可以看到课堂内的标签也没有正确居中?
答案 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运行,并且应该解决此问题。
希望这有帮助!