0

可能重复:
如何获取 GridLayout 中元素的 X 和 Y 索引?

我有一个想要使用的二维按钮数组。当我想调用 actionListener 时,如何判断我的这个二维数组中的哪个按钮索引被单击?这是我第一次与听众打交道,所以如果可以的话,请在更基本的层面上解释这一点。

这是一些关于我如何在网格(12x12)上布置按钮的代码

//A loop to add a new button to each section of the board grid.
for (int i = 0; i < gridSize; i++) {
  for (int j = 0; j < gridSize; j++) {
    gameButtons[i][j] = new JButton();
    gameButtons[i][j].setBackground(colors[(int)(Math.random() * numColors)]);
    boardGrid.add(gameButtons[i][j]);

    try {
      UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName());
    }
    catch (Exception e) {
    }

  }
}

这些按钮从之前创建的颜色数组中随机分配一种颜色。我现在必须覆盖 actionlistener,但我不知道如何以一种允许我按下按钮并将其与周围的其他按钮进行比较的方式来做到这一点。我想提一下,我正在处理静态方法。

4

3 回答 3

3

首先,您应该通过此方法将所有按钮注册到 actionlistener addActionListener()。然后在该actionPerformed()方法中,您应该调用getSource()以获取对单击的按钮的引用。

检查这个帖子

无论如何这里是代码, gameButtons[][] 数组必须在全球范围内可用

//A loop to add a new button to each section of the board grid.
for (int i = 0; i < gridSize; i++) 
{
  for (int j = 0; j < gridSize; j++) 
  {
    gameButtons[i][j] = new JButton();
    gameButtons[i][j].addActionListener(this);
    gameButtons[i][j].setBackground(colors[(int)(Math.random() * numColors)]);
    boardGrid.add(gameButtons[i][j]);

    try {
    UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName());
    } catch (Exception e) { } 
  }
}

//--------------------------------------------------------


@Override
public void actionPerformed(ActionEvent ae)
{
  for (int i = 0; i < gridSize; i++) 
  {
    for (int j = 0; j < gridSize; j++) 
     {
       if(ae.getSource()==gameButtons[i][j]) //gameButtons[i][j] was clicked
       {
             //Your code here
       }
     }
  }
}
于 2012-11-25T04:38:22.190 回答
2

如果您想避免再次循环遍历数组,您也可以将索引存储在中JButton

JButton button = new JButton();
button.putClientProperty( "firstIndex", new Integer( i ) );
button.putClientProperty( "secondIndex", new Integer( j ) );

然后在你的ActionListener

JButton button = (JButton) actionEvent.getSource();
Integer firstIndex = button.getClientProperty( "firstIndex" );
Integer secondIndex = button.getClientProperty( "secondIndex" );
于 2012-11-25T07:01:48.710 回答
1

如果您需要按下按钮的索引,请尝试以下操作:

private Point getPressedButton(ActionEvent evt){
    Object source = evt.getSource();
    for(int i = 0; i < buttons.length; i++){
        for(int j = 0; j < buttons[i].length; j++){
            if(buttons[i][j] == source)
                return new Point(i,j);
        }
    }
    return null;
}

然后你可以通过

Point p = getPressedButton(evt);

这意味着:

按下按钮 == 按钮[px][py]

否则,一个简单的调用evt.getSource();就可以完成这项工作。

于 2012-11-25T04:38:26.663 回答