有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

过去我对acm图形库做了很多工作,我刚刚开始研究斯坦福指定的突破问题。过去我在图形方面遇到过好几次的问题之一是,坐标不能准确地反映形状实际出现的位置,尽管我已经对它们进行了两次和三次检查。最后,对于那些作业,我盯着它,做了一些修改,直到它看起来合适为止。很明显,我遗漏了一些东西,因为一个简单的图形程序应该不会这么难

例如,使用acm。我的代码是这样的

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

Breakout对类中的run和其他方法进行了这些更改

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) 个答案

  1. # 1 楼答案

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

    @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);
    
  2. # 2 楼答案

    看起来您混淆了应用程序窗口的大小(不包括窗口边框,但包括菜单,在您的例子中是400*600)和可绘制区域的大小(不包括菜单),这意味着您在可绘制区域之外(在菜单下面)进行绘制

    您的窗口有:

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

    你也是

    • 需要读取画布大小并使用它而不是窗口大小:getCanvas().getHeight()
    • 需要设置画布大小而不是窗口大小,并根据需要设置窗口大小。由于GraphicsProgram是一个Applet,这似乎是不可能的
    • 需要找出菜单高度,并将窗口高度增加该数值(最后的手段)
  3. # 3 楼答案

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

    调用setSize()时,您只需注意它

    [关]我也在做这项突破任务,也有同样的问题。几分钟前在这个网站上发布。[/关]