当JFrame设置为不可调整大小时,但是当它可调整大小时,则会产生奇怪的渲染结果

时间:2014-12-13 11:42:40

标签: java rendering

我正在创建一个游戏,我有一个带有自定义Canvas的JFrame。 奇怪的是,当我将JFrame设置为 BE RESIZABLE 时,渲染结果如下所示:

The result when the JFrame is set to BE resizable

但是当我将JFrame设置为 NOT BE RESIZABLE 时,结果如下所示:

The result when the JFrame is set to NOT BE resizable

将纹理的像素阵列添加到BufferedImage的像素阵列的方法如下所示:

// DRAW A TEXTURE ON THE CANVAS
public void drawTexture(Texture texture, Vector2i location) {
    // Store the current texture coordinates
    int tx = 0, ty = 0;
    // Scroll through each pixel on the screen horizontally (begin at the X coordinate specified by the 'location')
    for(int x = location.x; (x < getWidth() && x < location.x + texture.getWidth()); x++) {
        // Scroll through each pixel on the screen vertically (begin at the Y coordinate specified by the 'location')
        for(int y = location.y; (y < getHeight() && y < location.y + texture.getHeight()); y++) {
            // Set each pixel to the color of the corresponding pixel on the Texture
            pixels[x + y * getWidth()] = texture.getPixels()[tx + ty * texture.getWidth()];
            // Add one to the texture Y coordinate
            ty++;
        }
        // Reset the ty variable
        ty = 0;
        // Add one to the texture X coordinate
        tx++;
    }
}

BufferedImage是在我的自定义画布的run方法中的循环内绘制的 自定义画布类(扩展Canvas offcourse)实现Runnable,它还包含一个自己的Thread用于渲染。

我想知道是否有人知道为什么会这样,也许是如何解决它,因为我无法弄明白......

2 个答案:

答案 0 :(得分:1)

嗯,&#34;应该是一个方形&#34; - 看起来好像是这样画的,因为背景被拉开&#34;在它下面。 (想象一下,试图在一张纸上画画,而有人慢慢将纸张拉开。)

所以,我猜测,设置窗口的线程正在慢慢地将其调整为正确的大小,而试图绘制你的方块的线程并不知道简单地利用移动的背景。

可能最简单的解决方案(如果这实际上就是为什么会这样做的话),就是在开始绘图之前简单地将你绘制方块的线程暂时休眠一会儿。 您可以使用Thread.sleep(1000)执行此操作。 (不过,你不应该在实际的程序中这样做。)

如果是这样,您可以尝试获取帧上的访问权限并使其内容同步。

答案 1 :(得分:0)

好吧,我找到了正确的答案here,因为我发现Canvas比我设定的要大,所以我用Google搜索,这个答案解决了这两个问题。

引用the other question的答案:

  

交换packsetResizable来电,以便pack成为第二个电话。

  

这是一个已知问题&#34;

问题here