我正在这些免费的在线斯坦福大学课程和学习Java。我陷入困境,无法弄明白。我认为我的逻辑肯定有问题。请查看下面的代码。我评论过,所以希望你能理解我在那里做的事情。
import acm.graphics.*;
import acm.program.*;
import java.awt.*;
public class Pyramid extends GraphicsProgram {
/** Width of each brick in pixels */
private static final int BRICK_WIDTH = 30;
/* Width of each brick in pixels */
private static final int BRICK_HEIGHT = 12;
/** Number of bricks in the base of the pyramid */
private static final int BRICKS_IN_BASE = 14;
/** The Width of the Base in px */
double baseInPx = BRICKS_IN_BASE * BRICK_WIDTH;
/** Taking the width of the window minus the width of the base and dividing by two
* to find the x axis starting point)
*/
double firstBrick = (getWidth() - baseInPx) / 2;
/* giving the y axis a variable name */
double baseHeight = getHeight();
public void run() {
add(new GRect(firstBrick,baseHeight,BRICK_WIDTH, BRICK_HEIGHT));
}
}
我想我必须在这行格式化中做错事:
double firstBrick = (getWidth() - baseInPx) / 2;
问题是我的x轴变量不起作用。如果我在那里对数字进行硬编码,则会显示rect,但不会显示firstBrick
感谢您的帮助!
编辑:谢谢大家的帮助!几乎每个人都是对的。我刚刚学到了一些东西!答案 0 :(得分:2)
我会尽力帮助你自己。尝试将计算移动到run方法并打印出值,以查看它与硬编码值时的预期差异。
答案 1 :(得分:2)
将firstBrick和baseHeight移动到run方法中,看看是否有效。
public void run() {
double firstBrick = (getWidth() - baseInPx) / 2;
double baseHeight = getHeight();
add(new GRect(firstBrick,baseHeight,BRICK_WIDTH, BRICK_HEIGHT));
}
我的猜测是你的getWidth()和getHeight()是实例方法,而不是静态方法。所以你不能在你的对象初始化块中调用它们(在你的示例代码中:任何方法之外的inits),因为Pyramid对象尚未完全初始化。
您还可以声明变量的位置,并在Pyramid构造函数中初始化它们,这是首选方法。这就是构造函数的用途。
答案 2 :(得分:0)
看看这段代码
public class Assignment {
private String a = setString();
private String b;
public Assignment() {
b = "set in constructor";
}
private String setString() {
return b;
}
private String getA() {
return a;
}
public static void main(String[] args) {
System.out.println(new Assignment().getA());
}
}
这将打印null;
我猜是类似的事情正在发生。也许金字塔的宽度和高度是在构造函数中设置的,因此在调用时,getWidth和getHeight默认为0.0。
答案 3 :(得分:0)
尝试在run方法中或在构造函数中设置firstBrick和baseHeight。
import acm.graphics.*;
import acm.program.*;
import java.awt.*;
public class Pyramid extends GraphicsProgram {
private static final int BRICK_WIDTH = 30;
private static final int BRICK_HEIGHT = 12;
private static final int BRICKS_IN_BASE = 14;
double baseInPx = BRICKS_IN_BASE * BRICK_WIDTH;
double firstBrick;
double baseHeight;
public void run() {
firstBrick = (getWidth() - baseInPx) / 2;
baseHeight = getHeight();
add(new GRect(firstBrick,baseHeight,BRICK_WIDTH, BRICK_HEIGHT));
}
}
答案 4 :(得分:0)
你的问题就在这一行:
double firstBrick =(getWidth() - baseInPx)/ 2;
在执行此行的时间点,getWidth()返回0;操作会产生一个不会被绘制的负数。
如前所述,您必须在构建UI后调用该函数。 - > run()的
答案 5 :(得分:0)
如果您真的需要,答案就在this link的底部。你是在正确的轨道上,但你正在谈论的特定线路是正确的。