Java多个按钮坐标

问题描述:

我是Java新手。Java多个按钮坐标

我正在开采矿山。我用paramteres(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]); 
     } 
    } 
+0

1)为了更好地帮助越早,张贴[SSCCE(http://sscce.org/)。 2)最好每个问题提出一个问题。 3)布局管理器通常会在整个大小上遵守组件的首选大小。 4)请复制/粘贴错误信息和异常输出,并使用代码格式化。 5)'ActionListener'可能更适合这个GUI中的按钮。它有什么作用? – 2012-03-22 09:19:27

+0

你不能在循环中不断改变x和y'final'。你可以做什么(但它是一个丑陋的黑客,这就是为什么我不把它作为答案),在嵌套循环中放置一个声明:'final int x2 = x; final int y2 = y',并在您的侦听器中引用'x2'和'y2'。如Andrew所说,“ActionListener”更合适,并且设置preferredSize而不是大小。 – 2012-03-22 09:22:47

,必须先创建一个自定义类监听器,而不是一个匿名的一个,因为它需要的参数(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()更改。

  1. 地雷是更好地利用JToggleButtons

  2. 放在那里ClientProperty