Java 我如何制作一个50乘50标签的网格?

Java 我如何制作一个50乘50标签的网格?,java,user-interface,Java,User Interface,我正在重新制作经典游戏“蛇”。我的想法是首先制作一个由50 x 50个单元格组成的网格,其中每个单元格都是一个10 x 10像素的标签 然而,我不能让它工作。我使用的是GridLayout,但不知怎么的,这并没有真正起作用,因为我显然无法设置每个网格的站点 我在Youtube上看了一段视频,其中一个家伙制作了一个井字游戏,游戏中每个网格的大小自动适应添加图像的大小。如果我使用标签而不是图像,该怎么办 基本上,我应该怎么做才能使每个单元10×10像素大,并将它们放在50x50个单元的网格中 imp

我正在重新制作经典游戏“蛇”。我的想法是首先制作一个由50 x 50个单元格组成的网格,其中每个单元格都是一个10 x 10像素的标签

然而,我不能让它工作。我使用的是GridLayout,但不知怎么的,这并没有真正起作用,因为我显然无法设置每个网格的站点

我在Youtube上看了一段视频,其中一个家伙制作了一个井字游戏,游戏中每个网格的大小自动适应添加图像的大小。如果我使用标签而不是图像,该怎么办

基本上,我应该怎么做才能使每个单元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
import java.awt.*;
导入javax.swing.*;
公共类主食蛇{
JFrame框架;
JLabel[][]细胞;
mainsake(){
//帧初始化
框架=新的JFrame(“蛇”);
frame.getContentPane().setBackground(颜色:黑色);
框架。设置尺寸(500500);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setresizeable(false);
frame.setLayout(新的GridLayout(50,50));
createCells();
}//结束mainsake
公共静态void main(字符串[]a){
新的mainsake();
}//末端总管
公共void createCells(){
int a=0;
int i;
单元格=新的JLabel[50][50];
对于(i=0;i<50;i++){
如果(i<50){
单元格[i][a]=新的JLabel(“”);
单元格[i][a].set不透明(真);
细胞[i][a].背景(颜色.白色);
单元格[i][a].setboorder(BorderFactory.createLineBorder(Color.BLUE,1));
单元格[i][a].setPreferredSize(新维度(10,10));
加上(单元格[i][a]);
}如果(i==49){
i=0;
aa++;
}
}//结束
}
}//结束类
这就是我得到的(我只添加了边框,以便能够看到每个单元格的外观):


肯,你有时间的时候能试试这个解决方案吗

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
    }

}
import java.awt.*;
导入javax.swing.*;
公共类主食蛇{
JFrame框架;
JPanel小组;
JLabel[][]细胞;
mainsake(){
//帧初始化
框架=新的JFrame(“蛇”);
frame.setLayout(新的BorderLayout());
frame.getContentPane().setBackground(颜色:黑色);
框架设置尺寸(700700);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//frame.setresizeable(false);
panel=新的JPanel();
面板设置布局(新网格布局(50,50));
框架。添加(面板);
createCells();
panel.revalidate();
panel.repaint();
}//结束mainsake
公共静态void main(字符串[]a){
新的mainsake();
}//末端总管
公共void createCells(){
int i;
单元格=新的JLabel[50][50];
对于(i=0;i<50;i++){
对于(int j=0;j
此代码有两个地方似乎不正确

首先,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
抽签形式显然不正确。正确的处理方法是,您实际上需要使用

这将重新绘制您的屏幕,尽管在准备就绪之前,您会看到它与旧图像一起闪烁

最好是将所有内容都绘制到框架上,然后使其可见

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

最后一个问题是尺寸不能正常工作,但是当您可以看到所有内容时,您可以更容易地解决这个问题。

您可以省略布局,只需单独设置每个标签的位置和大小。也就是说,为特定目的使用标签似乎不是特定任务的最佳解决方案。@ammoQ Ok谢谢。你认为有什么比使用标签更好的解决方案?对于这种交互式游戏,你可能希望使用单个画布(awt)或JPanel(Swing)并重写paint()方法来绘制自己的图形。BarrySW19已经给了你我也会给出的答案。谢谢,我会看看这个谢谢,我会看看这个
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]);
    }
}
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();
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);