0

过去我对 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 像素的黑色边框,但事实并非如此。我试过改变像素的百分比,效果更差。手动编辑该框,直到 Yvalue 看起来接近 -35,尽管这有点太远了。有人知道出了什么问题吗?

应用窗口

对运行和类中的其他方法所做的这些更改进行了突破。

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);
}
4

3 回答 3

2

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

您的窗口有:

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

你要么

  • 需要读取画布大小并使用它而不是窗口大小:getCanvas().getHeight()
  • 需要设置画布大小而不是窗口大小,并根据需要设置窗口大小。作为GraphicsProgram一个Applet,这似乎是不可能的。
  • 需要找出菜单高度并将窗口高度增加该数量(最后的手段)。
于 2012-11-14T10:40:46.330 回答
0

可以使用 setSize() 方法更改窗口的大小。这样做,您仍然面临坐标问题。读取工作区大小时,宽度不断减小16,高度减小58(可能是因为菜单和W7边框,如前所述)。

你只需要在调用 setSize() 时注意它。

[OFF]我也在处理这个突破任务并且遇到了同样的问题。几分钟前在此网站上发布。[/OFF]

于 2012-11-14T13:23:23.300 回答
0

我已经养成了在所有小程序的加载时间显式设置应用程序大小的习惯。这是我通常设置窗口大小的方式:

@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);
于 2012-11-22T21:33:56.857 回答