将JLabel的2D数组打印到GridLayout

时间:2016-03-22 16:25:03

标签: java arrays swing jlabel grid-layout

我有一个迷宫创作者计划,想把它变成一个gui。我的迷宫是2D阵列,因此我计划在JPanel中创建一个JLabel的2D阵列,并根据它是路径还是墙壁为每个标签分配颜色。我可以创建JLabel的2D数组并将其添加到我的面板中,但是当我运行它时,所有JLabel都向右移动一个空格,所以我的左上角有一个空白区域,还有一个列和一个比那里少的行#39;假设是。

图片的图片:

http://i.stack.imgur.com/MmDvf.png

这是我的代码;我不确定问题是什么。我尝试改变GridLayout的大小,改变我的循环运行次数,改变row和col的值(现在都是10),并尝试在该位置手动创建额外的JLabel,但没有骰子。

public Maze() {
    JPanel panel = new JPanel();
    getContentPane().add(panel);

    int row = MazeCreator.r;
    int col = MazeCreator.c;

    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setBounds(100, 100, 500, 500);
    getContentPane().setLayout(new GridLayout(row, col));

    JLabel[][] grid= new JLabel[row][col];
    for (int i = 0; i < row; i++){
        for (int j = 0; j < col; j++){
            grid[i][j] = new JLabel();
            grid[i][j].setBorder(new LineBorder(Color.BLACK));
            //grid[i][j].setBackground(Color.black);
            grid[i][j].setOpaque(true);
            super.add(grid[i][j]);
        }
    }
    grid[0][0].setBackground(Color.red);
}

我可以&#34;修复&#34;通过从col中减去1并将1添加到行,可以产生太少的行和太多的cols,但这只会创建99个JLabel而不是100个,就像我说的那样,手动放入左上角的JLabel不起作用。

2 个答案:

答案 0 :(得分:3)

请勿使用super.add()将标签添加到面板中。并将面板的布局设置为GridLayout而不是JFrame

public Maze() {
    JPanel panel = new JPanel();
    getContentPane().add(panel);

    int row = MazeCreator.r;
    int col = MazeCreator.c;

    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setBounds(100, 100, 500, 500);
    panel.setLayout(new GridLayout(row, col));

    JLabel[][] grid= new JLabel[row][col];
    for (int i = 0; i < row; i++){
        for (int j = 0; j < col; j++){
            grid[i][j] = new JLabel();
            grid[i][j].setBorder(new LineBorder(Color.BLACK));
            //grid[i][j].setBackground(Color.black);
            grid[i][j].setOpaque(true);
            panel.add(grid[i][j]);
        }
    }
    grid[0][0].setBackground(Color.red);
}

答案 1 :(得分:2)

您的代码结构令人困惑。

super.add(....);

使代码复杂化。你为什么要使用超级(...)?您可以专门为标签创建一个面板,以将标签直接添加到面板中。不要使用超级。

通过明确创建游戏面板简化逻辑,然后将组件添加到该面板:

JPanel gamePanel = new JPanel( new GridLayout(...) );

for (...)
{
    JLabel label = new JLabel(...);
    gamePanel.add( label );
}

add( gamePanel ); // add our game panel to the content pane of the frame.

现在您的代码更明确,更不容易出错。