在Java中为GridLayout创建单元格

时间:2013-12-17 22:27:29

标签: java layout grid grid-layout

我正在尝试为java中的蛇和梯子游戏创建一个网格,但我有一个小问题,即我创建的网格中有一个不需要的空间

enter image description here

有谁知道我怎么能摆脱它?

这是我为客户端编写的代码(Client.java):

//Initialize Grid Cells
private Cell[][] cell =  new Cell[10][10];          

//Create Grid Layout 
GridLayout GameBoard = new GridLayout(10, 10, 1, 1); //Create GridLayout             
GameArea.setLayout(GameBoard); //Add GridLayout  
GameArea.setPreferredSize(new Dimension(590,560));
GameArea.setOpaque(false); 

//Add Cells to Grid
for (int v = 0; v < 10; v++) 
for (int h = 0; h < 10; h++)
GameArea.add(cell[v][h] = new Cell(v, h, this));       

//Individual Image on Each Cell    
cell[1][0].add(new JLabel(GreenGrid));

这是我对单元格(Cells.java)的代码,它还扩展JPanel

//Indicate the row and column of this cell in the board
private int GridRow;
private int GridColumn;

private Client parent;

public Cell(int GridRow, int GridColumn, Client GUI) {

  this.GridRow = GridRow;
  this.GridColumn = GridColumn;
  this.parent = GUI;

  setBorder(new LineBorder(Color.orange, 1));   // Set cell's border
  setBackground(Color.gray);

} 

2 个答案:

答案 0 :(得分:2)

我无法看到您的图片,但我怀疑您有布局问题。您的Cell是否会延长JPanel?您是否设置了布局管理器,还是使用默认的FlowLayout?

考虑:

  • 你不应该在GameBoard上调用setPreferredSize(...),因为这将决定你的网格单元格大小,这太大了。
  • 相反,单元格本身应该决定它们自身和整个网格的大小。
  • 考虑让Cell覆盖getPreferredSize()并返回JLabel图像的维度(如果存在)或者返回超级结果。
  • 在添加所有组件之后,在将其设置为可见之前,请务必在顶级窗口上调用pack()
  • 考虑让Cell使用BorderLayout并将你的JLabel添加到BorderLayout.CENTER位置,以便它填充单元格(如果这是你想要的那样)。

要获得更多帮助和更好的帮助,请考虑创建并发布sscce

答案 1 :(得分:1)

你的第一个问题就在这里......

GridLayout GameBoard = new GridLayout(10, 10, 1, 1); //Create GridLayout

如JavaDocs中所述...

  

public GridLayout(int rows,
            int cols,
            int hgap,
            int vgap)

     

创建具有指定行数和列数的网格布局。   布局中的所有组件都具有相同的大小。

     

此外,水平和垂直间隙设置为指定的   值。在每列之间放置水平间隙。   在每行之间放置垂直间隙。

     

行和列中的一个但不是两个都可以为零,这意味着任何行   对象数量可以放在一行或一列中。

这意味着,您通过向hgapvgap参数提供非零值来提供差距。

如果你使用像...这样的东西。

GridLayout GameBoard = new GridLayout(10, 10); //Create GridLayout             

你最终会得到像......

Base Grid

正如已经提到的,我会避免使用GameArea.setPreferredSize(new Dimension(590,560));,而是覆盖getPreferredSizeCell类。由于GridLayout的工作方式,这不会阻止细胞大小调整,但无论如何这可能都是可取的......