如何制作50到50个标签的网格?

时间:2014-10-20 15:13:30

标签: java user-interface

我正在重建经典游戏'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

这就是我得到的(我只添加了边框,以便能够看到每个单元格的样子):

enter image description here

2 个答案:

答案 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);

最后一个问题是尺寸无法正常工作,但是当你看到所有东西时,它会更容易解决。