GridLayout面板添加不考虑优先大小

时间:2016-12-09 15:43:53

标签: java swing jpanel grid-layout

我目前正在编写一个java项目,我需要一个名为board的JPanel来包含一些本身就是JPanel的Tiles,我将它们添加到适当大小的布局中,但是当我在一个grouplayout中添加按钮时一个JFrame,只有第一个Tile是合适的大小,而其他的有大小可笑,如1p宽度和50p高度或1 * 1p。

我不觉得我错过任何东西,所有内容都添加到JFrame中并添加到正确的布局中,具有正确的行数和行数,并且在Tile类中将大小设置为50 * 50p。以下是一些包含图形设置的代码片段,尤其是构造函数:

Tile.java:

class Case extends JPanel
{

private int _color;
private boolean _star;
private Case _casePere;
private ArrayList<Case> _fils;
private int _x,_y;

public Case(int x, int y)
{
    _color = 0;
    _star = false;
    _casePere = null;
    _fils = new ArrayList<Case>();
    _x = x;
    _y = y;
    setPreferredSize(new Dimension(50,50));
    setMinimumSize(new Dimension(50,50));
    setBackground(Color.WHITE);
}

Board.java:

class Board extends JPanel{

private Case[][] _grid;
private Case[] _starsp1;
private Case[] _starsp2;

// constructeur
public Board(int nbStars, int length){



    _grid = new Case[length][length];
    _starsp1 = new Case[nbStars];
    _starsp2 = new Case[nbStars];

    //graphisme
    Dimension d = new Dimension(50*length, length*50);

    setBackground(Color.BLACK);
    setPreferredSize(d);


    GridLayout layout = new GridLayout(Constante.length, Constante.length,2 ,2);
    setLayout(layout);

    for(int y=0; y<length; ++y)
    {
        for(int x=0; x<length; ++x)
        {

            _grid[x][y] = new Case(x,y);
            add(_grid[x][y]);
        }
    }

如果你愿意,我可以添加一些Window类的片段,但除了Board之外,其他组件没有任何问题,它主要是添加和分组一些组件。这是输出的屏幕截图,因此您可以看到Board的绘图行为

编辑:我在我的Case类中重写了getX和getY,再次覆盖了JPanel的一个有点愚蠢的问题,感谢答案

https://i.stack.imgur.com/BAosv.png

1 个答案:

答案 0 :(得分:2)

setPreferredSize(d);

不要设置电路板的首选尺寸。电路板的布局管理器将根据添加到网格的组件数量和添加的最大组件的大小确定首选大小。

注意,(基于下面的一行)您希望计算中不包含的每个组件之间的间距为2像素。所以让布局管理器完成它的工作。

GridLayout layout = new GridLayout(Constante.length, Constante.length,2 ,2);

我们不知道Constante.length是什么。您将长度变量传递给您的类,因此请使用该变量。

另外,为什么你的Case类有这么多实例变量?这些变量从未在发布的代码中使用。所以也许你有其他方法导致布局问题。例如,不要覆盖getX()getY()布局管理器使用的那些方法。