在java中偏移GIF的GUI网格?

时间:2014-06-15 00:25:16

标签: java swing layout-manager grid-layout

所以我试图制作战舰游戏,然后我实现了一个包含一些像素化水的GIF的10x10网格。现在,我试图做的是将网格向下和向右偏移一个单元格,这样我就可以在真实的战舰游戏中沿着侧面和顶部放置数字和字母。问题是当我试图抵消它时,它会移除整个右侧的单元格列并相应地减少窗口,反之亦然。这是我的代码:

编辑3:我已经替换了gif,以便每个人都可以使用它,只需复制代码并运行它。

public class ButtonGrid {

JFrame frame=new JFrame(); //creates frame
    JLabel[][] grid; //names the grid of buttons

    public ButtonGrid(int width, int length) throws MalformedURLException{ 
        URL urlPic = new URL("http://i47.tinypic.com/14wswi9.gif");
        ImageIcon urlPicture = new ImageIcon(urlPic);

            frame.setLayout(new GridLayout(width,length)); //set layout
            grid=new JLabel[width][length]; //allocate the size of grid
            for(int y=0; y<length; y++){
                    for(int x=0; x<width; x++){
                            grid[x][y]= new JLabel(urlPicture); //creates new button
                            frame.add(grid[x][y]); //adds button to grid
                    }
            }

            grid[1][1].setForeground(Color.red);

            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setSize(270, 400);
            frame.pack(); //sets appropriate size for frame
            frame.setVisible(true); //makes frame visible
    }
    public static void main(String[] args) throws MalformedURLException{
            new ButtonGrid(11,11);//makes new ButtonGrid with 2 parameters
    }
}
编辑:似乎我可能没有说清楚这一点。在真正的战舰游戏中,有一排数字和一列字母。网格的其余部分只是水,里面有船只。使用我提供的代码,整个网格都是水,我想要偏移以放置一行数字和一列字母,就像真正的战舰板一样。如果我尝试在当前网格上放置任何内容,它就不会改变任何东西。我试图改变前景色,甚至将其中一个单元格的图像改为不同的格子,网格仍保持不变;一个11 x 11网格的动画像素水。

第二次编辑:我已经重写了我的代码,在窗口的顶部和左侧绘制了一个网格,但现在我得到一个空指针异常。我不确切地知道这有什么问题:

编辑四:删除了不需要的代码。

2 个答案:

答案 0 :(得分:2)

我不确定我是否真的理解这个问题,但如果您想在网格中显示组件,我认为您应该使用GridLayout。

//frame.setLayout(new FlowLayout());
frame.setLayout( new GridLayout(0, 11) );

或许你会做这样的事情

JPanel topPanel = new JPanel(new GridLayout(1,11)); //使用循环为字母创建11个标签,并将标签添加到面板

JPanel leftPanel = new JPanel(new GridLayout(10,1)) //使用循环为字母创建10个标签,并为面板创建标签

使用当前循环创建带有10 x 10标签网格的“gamePanel”。

然后使用以下方法将3个面板添加到框架中:

frame.add(topPanel, BorderLayout.NORTH);
frame.add(leftPanel, BorderLayout.WEST);
frame.add(gamePanel, BorderLayout.CENTER);

答案 1 :(得分:2)

获得所需内容的一种方法是使用我在Chess GUI中使用的与列(A-H)和行(8-1)相同的技术,如下所示。查看代码,看看您是否可以在自己的代码中实现它。

如果失败,请发布您自己的MCVE(最小完整和可验证示例)(而不是不可编译的代码段)。获取示例图像的一种方法是热链接到this answer中看到的图像(再次像链接代码那样)。