基本Java图形和坐标无法正常工作

时间:2012-11-14 10:15:41

标签: java graphics applet breakout acm-java-libraries

过去我使用acm图形库做了很多,我刚刚开始研究斯坦福分配的突破问题。我过去曾经多次使用图形的问题之一是坐标不能准确地反映出形状实际出现的位置,尽管我已经对它们进行了双重和三重检查。最后,对于那些作业,我最终注视并进行修改,直到它看起来很正确。很明显我在这里遗漏了一些东西导致简单的图形程序不应该这么困难。

例如,使用acm.graphics我的代码看起来像这样。

public static final int APPLICATION_WIDTH = 400;
public static final int APPLICATION_HEIGHT = 600;

public void setupBorder(){
    // **Sets Black Background
    GRect b = new GRect(0,0,400,600);  //** Sets Black Background
    fillObj(b,Color.black);
    add(b);

    //**Sets White Square so border is 5 pixels wide on each side
    b = new GRect(5,5,APPLICATION_WIDTH-10,APPLICATION_HEIGHT-10);
    fillObj(b,Color.white);
    add(b);
    }

所以我的想法是,它向右移动5个像素,向下移动5个像素我需要减去那些然后额外的5个像素,每边有一个边框5个像素(基本2b + x = 1个边,2a + y =垂直边)。您会认为这会在每侧创建一个黑色边框5像素,中间有一个白色方块,但事实并非如此。它在窗口的左侧,右侧和顶侧创建边框,但不在底部。有了这么简单的事情,可能出现什么问题?我有双倍,三倍,甚至四倍检查纸上的计算,它应该是一个中间的白色正方形,有一个5像素的黑色边框,但事实并非如此。我已经尝试更改百分比的像素,效果更差。手动编辑框,直到它看起来接近-Y值约为-35,尽管这有点太过分了。任何人都知道出了什么问题?

appwindow http://i46.tinypic.com/10rob61.jpg

Breakout将这些更改用于运行以及类中的其他方法。

public void run() {
    /* You fill this in, along with any subsidiary methods */
    init();
}

public void init(){

    setupBorder();


}

public void setupBorder(){
    //**Black Background
    GRect b = new GRect(0,0,400,600);  //**Black Background
    fillObj(b,Color.black);
    add(b);

    b = new GRect(5,5,APPLICATION_WIDTH-10,APPLICATION_HEIGHT-10);
    fillObj(b,Color.white);
    add(b);
}

public void fillObj(GFillable a, Color argC)
{
    a.setFillColor(argC);
    a.setFilled(true);
}

3 个答案:

答案 0 :(得分:2)

看起来您混淆了应用程序窗口的大小(不包括窗口边框,但包括菜单,以及 400 * 600在您的情况下)与您的大小相混淆可绘制区域(不包括菜单),这意味着您要在可绘制区域(位于菜单下方)之外进行绘画。

您的窗口有:

  • 操作系统提供的边框。它内部是400x600。
  • 菜单栏。
  • 菜单栏下方的可绘制区域(画布)。菜单栏宽度小于400x600。

你要么

  • 需要读取画布大小并使用它而不是窗口大小:getCanvas().getHeight()
  • 需要设置画布大小而不是窗口大小,并根据需要调整窗口大小。由于GraphicsProgramApplet,所以这似乎不可能。
  • 需要找出菜单高度并增加窗口高度(最后的手段)。

答案 1 :(得分:0)

可以使用setSize()方法更改窗口的大小。不然,你仍然面临着一个坐标问题。当读取工作区域的大小时,宽度不断减少16,高度减少58(可能是由于菜单和W7边框,如前所述)。

调用setSize()时只需要处理它。

[OFF]我也正在进行这项突破任务并遇到同样的问题。几分钟前发布在这个网站上。[/ OFF]

答案 2 :(得分:0)

我习惯于明确设置应用程序大小@所有applet的加载时间。这就是我通常设置窗口大小的方法:

@Override

public void init(){
    resize(APPLICATION_WIDTH, APPLICATION_HEIGHT);
}

此外,您无需从 run() 中调用 init() ;它在初始化时由 appletviewer 自动调用。

我认为你应该使用:

b = new GRect(5,5,getWidth()-10,getHeight()-10); //gets window width & height

或:::

b = new GRect(5,5,b.getWidth()-10,b.getHeight()-10); //gets former 'b' width & height

而不是:

b = new GRect(5,5,APPLICATION_WIDTH-10,APPLICATION_HEIGHT-10);