我应该使用哪种Swing布局来移动JButton

时间:2017-11-28 22:18:01

标签: java swing

我有一个14x14的Board,它有JButtons,每个Jbutton都有不同的颜色。单击其中一个按钮时,它会检查具有相同颜色的邻居并将其删除。当它移除它们时,板之间有一个空白区域,因此上面的按钮应向下移动以填充空白区域。我尝试使用GridLayout,但我不知道如何移动上面的按钮。

2 个答案:

答案 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数组也会起作用。)