我正在重建经典游戏'Snake'。我的想法是首先制作一个50 x 50个单元格的网格,其中每个单元格都是10 x 10像素的标签。
然而,我无法让它发挥作用。我正在使用GridLayout,但不知怎的,这不起作用,因为我显然无法设置每个网格的网站。
我在Youtube上观看了一个视频,其中一个人做了一个tic tac toe游戏,其中每个网格的大小自动适应添加的图像的大小。如果我使用标签而不是图像,我该怎么办?
基本上,我应该怎样做才能使每个单元格10个像素大10个,并将它们放入50x50单元格的网格中?
import java.awt.*;
import javax.swing.*;
public class MainSnake {
JFrame frame;
JLabel[][] cells;
MainSnake() {
//Frame initializion
frame = new JFrame("Snake");
frame.getContentPane().setBackground(Color.BLACK);
frame.setSize(500, 500);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setResizable(false);
frame.setLayout(new GridLayout(50, 50));
createCells();
} //End MainSnake
public static void main(String[]a) {
new MainSnake();
} //End main
public void createCells(){
int a = 0;
int i;
cells = new JLabel[50][50];
for (i = 0; i < 50; i++){
if(i < 50){
cells[i][a] = new JLabel("");
cells[i][a].setOpaque(true);
cells[i][a].setBackground(Color.white);
cells[i][a].setBorder(BorderFactory.createLineBorder(Color.BLUE, 1));
cells[i][a].setPreferredSize(new Dimension(10,10));
frame.add(cells[i][a]);
} if(i==49){
i = 0;
aa++;
}
} //End for
}
} //End Class
这就是我得到的(我只添加了边框,以便能够看到每个单元格的样子):
答案 0 :(得分:1)
肯,你有空的时候可以尝试这个解决方案吗?
import java.awt.*;
import javax.swing.*;
public class MainSnake {
JFrame frame;
JPanel panel;
JLabel[][] cells;
MainSnake() {
// Frame initializion
frame = new JFrame("Snake");
frame.setLayout(new BorderLayout());
frame.getContentPane().setBackground(Color.BLACK);
frame.setSize(700, 700);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//frame.setResizable(false);
panel = new JPanel();
panel.setLayout(new GridLayout(50, 50));
frame.add(panel);
createCells();
panel.revalidate();
panel.repaint();
} // End MainSnake
public static void main(String[] a) {
new MainSnake();
} // End main
public void createCells() {
int i;
cells = new JLabel[50][50];
for (i = 0; i < 50; i++) {
for (int j = 0; j < cells.length; j++) {
cells[i][j] = new JLabel(i+"");
cells[i][j].setOpaque(true);
cells[i][j].setBackground(Color.white);
cells[i][j].setBorder(BorderFactory.createLineBorder(Color.BLUE, 1));
//cells[i][j].setPreferredSize(new Dimension(10, 10));
panel.add(cells[i][j]);
}
} // End for
}
}
答案 1 :(得分:1)
此代码有两件事似乎不正确。
首先,你的for循环没有正确退出,也没有正确退出。这是你的代码:
for (i = 0; i < 50; i++){
if(i < 50){
cells[i][a] = new JLabel("");
cells[i][a].setOpaque(true);
cells[i][a].setBackground(Color.white);
cells[i][a].setBorder(BorderFactory.createLineBorder(Color.BLUE, 1));
cells[i][a].setPreferredSize(new Dimension(10,10));
frame.add(cells[i][a]);
} if(i==49){
i = 0; //the i++ is applied after this is complete in the for loop, resulting in skipping row 0!!!
aa++; //This should be a++
}
} //End for
传统上,我更喜欢嵌入式循环。这是您修改后的代码:
public void createCells() {
int a = 0;
int i;
cells = new JLabel[50][50];
for (i = 0; i < 50; i++) {
if (i < 50) {
cells[i][a] = new JLabel("");
cells[i][a].setOpaque(true);
cells[i][a].setBackground(Color.white);
cells[i][a].setBorder(BorderFactory.createLineBorder(
Color.BLUE, 1));
cells[i][a].setPreferredSize(new Dimension(10, 10));
frame.add(cells[i][a]);
}
if (i == 49) {
i = -1;
a++;
}
if (a == 50) {
return;
}
} // End for
}
这是通常首选的方式:
for(int a = 0; a < 50; a++) {
for (i = 0; i < 50; i++) {
cells[i][a] = new JLabel("");
cells[i][a].setOpaque(true);
cells[i][a].setBackground(Color.white);
cells[i][a].setBorder(BorderFactory.createLineBorder(
Color.BLUE, 1));
cells[i][a].setPreferredSize(new Dimension(10, 10));
frame.add(cells[i][a]);
}
}
请注意,这仍然是第一列。通常,大多数人会先行插入行。
第二个问题是在使框架可见之后,在最后使用了createCells。
frame = new JFrame("Snake");
frame.getContentPane().setBackground(Color.BLACK);
frame.setSize(500, 500);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setResizable(false);
frame.setLayout(new GridLayout(50, 50));
createCells();
平局显然是畸形的。处理此问题的正确方法是您实际需要使用validate()
进行重新绘制frame.validate();
这将重新绘制您的屏幕,但在旧图像准备好之前您会看到它闪烁。
最好,你应该把所有东西都画在画框上,然后让它可见。
frame = new JFrame("Snake");
frame.getContentPane().setBackground(Color.BLACK);
frame.setSize(500, 500);
frame.setLayout(new GridLayout(50, 50));
createCells();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setResizable(false);
frame.setVisible(true);
最后一个问题是尺寸无法正常工作,但是当你看到所有东西时,它会更容易解决。