所以我试图制作战舰游戏,然后我实现了一个包含一些像素化水的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网格的动画像素水。
第二次编辑:我已经重写了我的代码,在窗口的顶部和左侧绘制了一个网格,但现在我得到一个空指针异常。我不确切地知道这有什么问题:
编辑四:删除了不需要的代码。
答案 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中看到的图像(再次像链接代码那样)。