我有一个14x14的Board,它有JButtons,每个Jbutton都有不同的颜色。单击其中一个按钮时,它会检查具有相同颜色的邻居并将其删除。当它移除它们时,板之间有一个空白区域,因此上面的按钮应向下移动以填充空白区域。我尝试使用GridLayout,但我不知道如何移动上面的按钮。
答案 0 :(得分:0)
您可以尝试使用JButtons的二维数组
JButton[][] buttons = new JButton[14][14];
for (int i=0; i < buttons.length; i++) {
for (int j=0; j < buttons[i].length; j++) {
buttons[i][j] = new JButton("Button [" + i + "][" + j + "]");
}
}
// Then do whatever,remove,change color,check next element in array
// and compare colors etc
buttons[2][3].setText("changed text");
答案 1 :(得分:0)
如果您希望在删除组件时占用更多空间来填充空白区域,则使用GridLayout
无法实现,但您可以添加一些空组件,例如JLabels
填补空间。
您可以使用Container
add (Component comp, int index)方法在特定索引的容器中添加组件。
此代码段将替换指定索引处的按钮(例如45),其中一个空白组件位于具有GridLayout
集的面板中:
JPanel boardPanel = new JPanel (new GridLayout (14, 14));
// ... add your buttons ...
// This code could be invoked inside an ActionListener ...
boardPanel.remove (45);
boardPanel.add (new JLabel (""), 45);
boardPanel.revalidate ();
boardPanel.repaint ();
这样,其他组件将不会移动,您只会看到一个空白区域替换您的按钮。
你可以实现更多:如果你在index = 0处添加空标签,所有按钮都会向右移动(请记住组件的数量不应该改变,否则组件将调整大小,你可能会获得不良行为)等等,你可以&#34;移动&#34;单个组件,只需将其删除并以不同的索引添加即可。
另一种方法是存储表示模型逻辑的二维对象数组(可以存储颜色和所需的所有东西),并通过重写paintComponent方法自行绘制它们。
有关自定义绘画方法的示例,请查看this MadProgrammer's answer,其中显示如何突出显示网格中的特定单元格(在这种情况下,他使用List来存储对象,但是使用2d数组也会起作用。)