我有一个迷宫创作者计划,想把它变成一个gui。我的迷宫是2D阵列,因此我计划在JPanel中创建一个JLabel的2D阵列,并根据它是路径还是墙壁为每个标签分配颜色。我可以创建JLabel的2D数组并将其添加到我的面板中,但是当我运行它时,所有JLabel都向右移动一个空格,所以我的左上角有一个空白区域,还有一个列和一个比那里少的行#39;假设是。
图片的图片:
这是我的代码;我不确定问题是什么。我尝试改变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不起作用。
答案 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.
现在您的代码更明确,更不容易出错。