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