0

重複の可能性:
GridLayout 内の要素の X および Y インデックスを取得する方法は?

使用したいボタンの 2D 配列があります。actionListener を呼び出したい場合、この 2D 配列のどのボタン インデックスがクリックされているかを確認するにはどうすればよいですか? リスナーとのやり取りは初めてなので、できればもっと基本的なレベルで説明してください。

ボタンをグリッド(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);

これは次のことを意味します。

押されたボタン == buttons[px][py]

それ以外の場合は、単純な呼び出しでevt.getSource();機能します。

于 2012-11-25T04:38:26.663 に答える