GridLayout在第一个单元格上堆叠所有JPanel

时间:2014-05-24 15:24:03

标签: java swing jpanel awt grid-layout

我正在尝试为使用gridLayout的JPanel制作的游戏创建地图。在我的第一次测试中,我使用5x5网格并创建我的小面板,这是JPanel的子类。我的程序创建它们很好但是当我将所有面板添加到更大的面板并显示它时,只显示第一个方块,其余的是空白。为什么这样做? 这是我的MapSpace代码(较小的面板):

import javax.swing.*;
import java.awt.*;
public class MapSpace extends JPanel{
    private int ownerTag;
    private int xPos, yPos;
    public MapSpace(){
        xPos = 0;
        yPos = 0;
        ownerTag = 0;
        setBackground(Color.WHITE);
    }
public MapSpace(MapSpace m){
        xPos = m.getX();
        yPos = m.getY();
        ownerTag = m.getID();
        setBackground(m.getColor());
    }

这是我的地图代码:

import javax.swing.*;
import java.awt.*;
import java.util.*;
public class Map extends JPanel{
    private int cols, rows;
    private int randCol, randRow;
    private MapSpace[][] spaces;
    Random gen = new Random();
    public Map(int w, int h){
        cols = h;
        rows = w;
        setLayout(new GridLayout(cols, rows));
        setBackground(Color.WHITE);
        spaces = new MapSpace[cols][rows];
        for(int i = 0; i < cols; i++){
            for(int j = 0; j < rows; j++){
                MapSpace panel = new MapSpace(i, j);
                spaces[i][j] = panel;
            }
        }
        assignSpaces(3);
        setColors();
        for(int i = 0; i < cols; i++){
            for(int j = 0; j < rows; j++){
                MapSpace spot = new MapSpace(spaces[i][j]);
                add(spot);
            }
        }
        setSize(400, 400);
    }

第二个嵌套for循环是添加所有mapSpaces的地方,但是当我将地图放在JFrame中并在GUI窗口中显示时,左上角只显示一个小方块。

1 个答案:

答案 0 :(得分:0)

为什么要尝试使用MapSpace实例创建MapSpace?

只需使用您想要的参数创建MapSpace,然后将MapSpace同时添加到Array和面板中。

  

并在GUI窗口中显示,只显示左上角的一个小方块。

可能是因为您没有为MapSpace类提供preferredSize()大小,因此它默认为(10,10),这是使用FlowLayout而没有添加任何组件的面板的大小。因此,由于您创建了一个5x5网格,您可能会看到一个(50,50)白色方块。

覆盖MapSpace类的getPreferredSize()以返回每个方块的默认尺寸。