2

我正在尝试使用斯坦福的在线 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

如果你仔细看图,你会发现class box里面的label也没有正确居中?

4

2 回答 2

1

您可以使用该setBounds方法将标签定位在您想要的位置。它需要四个 int 参数。例如:

text.setBounds(20,20,20,20);
于 2012-03-31T18:18:39.753 回答
0

编辑:哦,天哪,我在测试时误输入了您的代码!我不小心将这两个值相减,而不是相加。 getAscent()返回一个负数,表示文本上升到基线以上多少像素,因此该位置的正确公式是

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

逻辑是一样的,但否定的事实getAscent()意味着你必须翻转符号。对于那个很抱歉!


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

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

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

然后,您可以直接将程序作为 Java 应用程序而不是小程序运行,这个问题应该得到解决。

希望这可以帮助!

于 2012-03-31T18:38:37.850 回答