我是 Java 新手。
我在做地雷。我正在使用带有参数 (x_length, y_length) 的 GridLayout。我想知道我按下了哪个按钮 -> 他的坐标 (x,y)。但是,如果我将它键入给监听器,它会给我错误 -> 将 'x' 的修饰符更改为 final。 所以我的问题是如何简单地获取按钮的坐标?
而且我还想问一下我怎样才能简单地改变按钮的大小? setSize 对我不起作用。
for (int y = 0; y < y_length; y++)
{
for (int x = 0; x < x_length; x++)
{
buttons[x][y] = new JButton("X");
buttons[x][y].addMouseListener(new MouseAdapter()
{
public void mouseClicked(MouseEvent e)
{
if (e.getButton() == MouseEvent.BUTTON1)
{
//exception -> Cannot refer to a non-final variable x inside an inner class defined in a different method
JOptionPane.showMessageDialog(null, "Left -> " + x + " | " + y);
}
else if (e.getButton() == MouseEvent.BUTTON3)
{
JOptionPane.showMessageDialog(null, "Right -> " + x + " | " + y);
}
}
});
mines_array.add(buttons[x][y]);
}
}
最佳答案
您应该首先为您的监听器创建一个自定义类而不是匿名类,因为它需要参数(x 和 y)。
private static class ButtonMouseListener extends MouseAdapter {
private final int x;
private final int y;
public ButtonMouseListener(int x, int y) {
this.x = x;
this.y = y;
}
public void mouseClicked(MouseEvent e) {
if (e.getButton() == MouseEvent.BUTTON1) {
JOptionPane.showMessageDialog(null, "Left -> " + x + " | " + y);
} else if (e.getButton() == MouseEvent.BUTTON3) {
JOptionPane.showMessageDialog(null, "Right -> " + x + " | " + y);
}
}
}
然后,您可以像这样使用您的代码:
for (int y = 0; y < y_length; y++) {
for (int x = 0; x < x_length; x++) {
buttons[x][y] = new JButton("X");
buttons[x][y].addMouseListener(new ButtonMouseListener(x, y));
mines_array.add(buttons[x][y]);
}
}
就是这样,玩得开心。 关于按钮的大小,如果您在它们的父容器中使用布局,它们的大小将由布局自动计算并且不能通过 setSize() 更改。
关于Java多按钮坐标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9819173/