Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在JPanel周围安装JFrame,每1px发行一次?_Java_Swing_Jframe_Jpanel - Fatal编程技术网

Java 在JPanel周围安装JFrame,每1px发行一次?

Java 在JPanel周围安装JFrame,每1px发行一次?,java,swing,jframe,jpanel,Java,Swing,Jframe,Jpanel,所以我有这个问题已经有一段时间了,我似乎无法让它发挥作用。 我的游戏使用多个状态(JPanel),它们使用CardLayout在不同状态之间切换 每个游戏状态。然而,JFrame似乎在右侧和右侧将JPanel截断了1px 面板的底部 是启动时的外观图片(请注意,右侧和底部的红线不可见) 这就是我想要的(可见的右边和底线) 现在Game类正在扩展JFrame,state类正在扩展JPanel。 下面是游戏类的init()代码(在super()之后调用): 这是游戏状态的构造器(MenuState和

所以我有这个问题已经有一段时间了,我似乎无法让它发挥作用。 我的游戏使用多个状态(JPanel),它们使用CardLayout在不同状态之间切换 每个游戏状态。然而,JFrame似乎在右侧和右侧将JPanel截断了1px 面板的底部

是启动时的外观图片(请注意,右侧和底部的红线不可见) 这就是我想要的(可见的右边和底线)

现在Game类正在扩展JFrame,state类正在扩展JPanel。 下面是游戏类的init()代码(在super()之后调用):

这是游戏状态的构造器(MenuState和PlayState都扩展了游戏状态):

我想我认为导致这个问题的最后一个原因是瓷砖的渲染。 以下是在我的数学错误的情况下呈现瓷砖的代码:

/* 
Each tile is 32px X 48px, 
the map is 20 tiles X 15 tiles
Game.WIDTH = 640px, Game.HEIGHT = 720px */
public void render(Graphics g) {
    for(int row = 0; row < tiles.length; row++)
    {
        for(int col = 0; col < tiles[row].length; col++)
        {
            if(tiles[row][col] == TileType.GRASS)
            {
                g.drawImage(grass, col * tileWidth, row * tileHeight, tileWidth, tileHeight, null);
                g.setColor(Color.RED);
                g.drawRect(col * tileWidth, row * tileHeight, tileWidth, tileHeight); // Red lines.
            }
            else if(tiles[row][col] == TileType.LAVA)
            {
                g.drawImage(lava, col * tileWidth, row * tileHeight, tileWidth, tileHeight, null);
                g.setColor(Color.RED);
                g.drawRect(col * tileWidth, row * tileHeight, tileWidth, tileHeight); // Red lines.
            }
        }
    }
}
/*
每个瓷砖为32px 48px,
这张地图是20块X 15块
Game.WIDTH=640px,Game.HEIGHT=720px*/
公共空间渲染(图形g){
对于(int row=0;row
如果你们需要更多的信息,请告诉我! 谢谢你的帮助,
谢谢

g.drawRect(列*tileWidth,行*tilewhight,tileWidth,tilewhight);//红线
表示您正在将矩形的右边缘绘制到右侧的下一个平铺中,并相应地绘制底部边缘。这意味着,渲染图像中的每条红线的厚度为1像素,因为下一个平铺的左边缘绘制在上一个平铺的右边缘之上。但是,这意味着最后一条边位于面板外部。您可以使用
平铺宽度-1
平铺高度-1
作为绘制矩形的宽度和高度(生成2像素红线),或者为最后一行和最后一列平铺编写单独的算法,以便对其进行不同的处理。

设置首选尺寸(新尺寸(Game.width+1,Game.height))?为了更快地获得更好的帮助,请发布一个or。@Jerryq27无需感到愚蠢。这往往是我们最容易忽视的。
public GameState(Game game) {
    super();
    this.game = game;
    setPreferredSize(new Dimension(Game.WIDTH, Game.HEIGHT));
    setFocusable(true);
    setDoubleBuffered(true);
}
/* 
Each tile is 32px X 48px, 
the map is 20 tiles X 15 tiles
Game.WIDTH = 640px, Game.HEIGHT = 720px */
public void render(Graphics g) {
    for(int row = 0; row < tiles.length; row++)
    {
        for(int col = 0; col < tiles[row].length; col++)
        {
            if(tiles[row][col] == TileType.GRASS)
            {
                g.drawImage(grass, col * tileWidth, row * tileHeight, tileWidth, tileHeight, null);
                g.setColor(Color.RED);
                g.drawRect(col * tileWidth, row * tileHeight, tileWidth, tileHeight); // Red lines.
            }
            else if(tiles[row][col] == TileType.LAVA)
            {
                g.drawImage(lava, col * tileWidth, row * tileHeight, tileWidth, tileHeight, null);
                g.setColor(Color.RED);
                g.drawRect(col * tileWidth, row * tileHeight, tileWidth, tileHeight); // Red lines.
            }
        }
    }
}