アプリ版:「スタンプのみでお礼する」機能のリリースについて

swingをつかってJFrameに多数のJButtonをつくりました。どのボタンがクリックされたかを知りたいのです。
そのためにJButtonを配列として、宣言したところ、コンパイルは通るようですが、実行時にエラーとなります。
JButton[] button; と宣言してリスナーを次のように登録し、使いたいのです。
int i;
for(i=0;i<80;i++){
button[i].addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
loc=i;
}
}
}
このようにすれば、クリックされたときに、iの値をしらべれば、どのボタンがクリックされたかわかるとかんがえたのですが。実行時にエラーとなってしまいます。なにか良い方法はありませんか。

A 回答 (2件)

ボタン上の文字列を取得するためにgetActionCommand()を使うのは邪道です。

なぜなら、actionCommandは、もっと有用な情報を明示的にsetすることがあるからです。ボタン上のテキストは、getText()で取得してください。また、ActionEventを発火したオブジェクトそのものを知りたければ、Object o = e.getSource();として、if (o == ...){とやれば十分です。

> 実行時にエラーとなってしまいます。
エラーや例外に関しては、必ず、どの行でどんなエラー/例外が出たかを質問に明記してください。そうでないと、回答者が手がかりを得られません。

投稿されたコードそのものにはエラー要素が見あたらない、というかコードを取り巻く状況(たとえば、locって何だ?)が分からないので、実物コードそのものを投稿する必要があります・

たとえば、次のコードはノーエラーでコンパイルされますが、あなたのプログラムとどこが違うのでしょうか?。そしてもうひとつ、とても重要なのは、loc=i;という文では、このactionPerformed()メソッドが実際に呼ばれたとき=ボタンがクリックされたときのiの値(それはいくつでしょうか?)がlocに代入されることです。これはたぶん、あなたの要求とはまったく違うのではないでしょうか?。
--------------------------------------------
import javax.swing.*;
import java.awt.event.*;

public class Tora{
static int i, loc;

public static void main(String[] args){
JButton[] bta = new JButton[80];

for (i = 0; i < 80; ++i){
bta[i] = new JButton(String.valueOf(i));
bta[i].addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
loc = i;
}
});
}
}
}
-----------------------------------------------
    • good
    • 1

ボタンを作成してリスナを登録する前後に


button[i].addActionCommand(String.valueOf(i));
としておきます。

アクションリスナのactionPerformedメソッド内で
String command = e.getActionCommand();
とすると、設定してある文字列を取得することができるので
どのボタンが押されたのかを判断することができます。


具体的なコード
for (int i = 0; i < button.length; i++) {
  button[i] = new JButton();
  button[i].addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
      String command = e.getCommand();
      // commandに対応する処理を記述
    }
  });
  button[i].setActionCommand(String.valueOf(i));
}


なお、動作確認をしていませんのでこのまま動かなかったらすみません。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!