2012-04-30 6 views
2

あなたはこのようなコードでは、N×N個のグリッドにJButtonがののGridLayoutを考えてみましょう:へのアクセス、ローカルに定義されたJButtonが

JPanel bPanel = new JPanel(); 
bPanel.setLayout(new GridLayout(N, N, 10, 10)); 
    for (int row = 0; row < N; row++) 
    { 
     for (int col = 0; col < N; col++) 
     { 
      JButton b = new JButton("(" + row + ", " + col + ")"); 
      b.addActionListener(new ActionListener() 
      { 
       public void actionPerformed(ActionEvent e) 
       { 

       } 
      }); 
      bPanel.add(b); 
     } 
    } 

どのように変更し、グリッドで個別に各ボタンにアクセスしますsetText()を使用してボタンの名前を取得しますか?これは、問題のボタンを実際に押すことの外で行う必要があります。

各ボタンはローカルで「b」としてインスタンス化されているため、各ボタンのグローバルにアクセス可能な名前は現時点では使用できません。それぞれのボタンに個別にアクセスするには何ができますか? JButton [] []のような配列は、すべてのボタンへの参照を保持できますか?上記のコードでこれをどのように設定できますか?

ご了承ください。

ありがとうございました。

+1

おそらくhttp://stackoverflow.com/questions/8394296/の複製java-swing-gridlayout-accessible-specfic-coordinate –

+0

も参照してくださいこの[Q&A ](http://stackoverflow.com/q/7702697/230513)。 – trashgod

答えて

7

することができます、

1)putClientProperty

buttons[i][j].putClientProperty("column", i); 
buttons[i][j].putClientProperty("row", j); 
buttons[i][j].addActionListener(new MyActionListener()); 

public class MyActionListener implements ActionListener { 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     JButton btn = (JButton) e.getSource(); 
     System.out.println("clicked column " + btn.getClientProperty("column") 
       + ", row " + btn.getClientProperty("row")); 
} 

2)ActionCommand

+0

ああ、それはすてきです!すべてはputClientPropertyの内部です。 JButtonの配列の配列ではなく、これを試すことができます。ありがとう! – Avertheus

+0

ボタンごとにMyActionListenerのインスタンスは必要ありません。 1つのインスタンスがすべてのボタンで機能します。そうでなければ、素晴らしい答えです。 –

+0

お手伝いをしてうれしいです – mKorbel

3

すべてのボタンを格納する配列(またはリストなど)を作成できます。または、bPanel(コンテナ)のメソッドpublic Component[] getComponents()を使用することができます。