我正在制作一个项目,我有一个JButtons网格,我希望能够保存哪些按钮被点击到一个数组中。我知道如何获得每个按钮的坐标,但是对于我如何制作数组以及在点击JButton时更改存储在内部的坐标非常无能为力。 我的代码如下:
public ButtonGrid(int width, int length, String coords) {
frame.setLayout(new GridLayout(width, length));
grid = new JButton[width][length];
state = new HashMap<JButton, String>();
for (int y = 0; y < length; y++) {
for (int x = 0; x < width; x++) {
final JButton nb = new JButton();
nb.setPreferredSize(new Dimension(50, 50));
grid[x][y] = nb;
state.put(grid[x][y], "blank");
nb.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
Object source = e.getSource();
for (int i = 0; i < grid.length; i++) {
for (int j = 0; j < grid.length; j++) {
if (source == grid[i][j]) {
String coords = String.valueOf(grid[i][j]);
System.out.println(
Stream.of(coords.split("\\D+")).limit(3).collect(Collectors.toList()));
}
}
}
if (state.get(nb).equals("blank"))
mapButtonToColor(nb, "red");
else if (state.get(nb).equals("red"))
mapButtonToColor(nb, "blank");
setButtonColors();
}
});
frame.add(grid[x][y]);
}
}
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);
}
}
答案 0 :(得分:1)
首先,我建议你使用继承
public class GridButton extends JButton {
int x, y;
// String state; // probably put this here instead
public GridButton(int x, int y) {
super();
this.x = x;
this.y = y;
}
}
然后,您需要一个多于数组的列表,因为数组具有固定的大小,您应该可以根据需要单击
List<int[]> list = new ArrayList<>();
单击上述课程,而不是检查整个网格,您可以立即访问职位
首先,使用该类,所以替换
final JButton nb = new JButton();
带
final JButton nb = new GridButton(x, y);
在动作侦听器中,访问值以及添加到列表
@Override
public void actionPerformed(ActionEvent e) {
GridButton source = (GridButton) e.getSource();
list.add(new int[] {source.x, source.y});
}
在单击JButton时更改存储在内部的坐标
我不确定你为什么这样做,但是你必须通过该类的setter方法修改按钮本身,以及使用新的定位交换/重置Button数组