ここから本文です

ボタンのイベントについての質問です

duk********さん

2008/2/1203:58:37

ボタンのイベントについての質問です

現在、将棋に関連したプログラムを組んでるんですがボタンのイベントでつまずいてます、ご助力お願いします。
最初に数値(例:yoko=9、tate=9)を入力してその数のボタンを表示してマス目を作る動作なのですが、それぞれのボタンがクリックされたらイベントを発生させるようにしたいのです。
通常のイベント実装だったら下記のような形で実装できるわけですけど、
button1 = new JButton("");
panel.add(button1);
button1.addActionListener(this);
public void actionPerformed(ActionEvent e) {
処理

これとちがって、最初に入力される数がどのような数でも対応できるようにしたいのです。(ようするにマス目をユーザーの好きなように設定できるようにしたい)

JPanel fieldPanel=new JPanel(new GridLayout(tate,yoko));
for(int i=1;i<=tate;i++){
for(int j=1;j<=yoko;j++){
fieldPanel.add(new JButton(Integer.toString(i*10+j)));
}
}
これで表示するところまでは作れたのですが、アクションリスナーの実装ができません。
不特定多数のボタンを設置し、各ボタンにイベントを追加するにはどうしたらいいでしょうか?

閲覧数:
588
回答数:
2

違反報告

ベストアンサーに選ばれた回答

mar********さん

2008/2/1212:40:01

長いのでimport文は省略。
サンプルで作ってみました。
以下読みにくいとは思いますがインラインで回答します。

public class Buttontable implements ActionListener{
//ボタンと対応する表示文字列のマップ
Map<JButton,String> jButtonList = new HashMap<JButton,String>();
//対応する表示文字列を表示するラベル
JLabel label ;
//mainからコンストラクタ呼び出し
public static void main(String[] args) {
Buttontable buttontable = new Buttontable(3,3);
}
//コンストラクタ
public Buttontable(int tate,int yoko){
//フレーム初期化
JFrame frame = new JFrame();
//フレームの閉じた時の処理
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//レイアウトマネージャをnullにする(ラベルの表示位置を決めたいから)
frame.setLayout(null);
//サイズ設定
frame.setSize(400, 400);
//表示用ラベル初期化
label = new JLabel();
//表示用ラベルのサイズ・表示位置設定
label.setBounds(100, 250, 200, 50);
//フレームにラベルを追加
frame.add(label);
//パネル初期化
JPanel fieldPanel=new JPanel(new GridLayout(tate,yoko));
//パネルのサイズ設定
fieldPanel.setSize(200, 200);
//ここから問題のループ
for(int i=0;i<tate;i++){
for(int j=0;j<yoko;j++){
//ループ一回につき一回ボタンを初期化
JButton jButton = new JButton(Integer.toString((i*10)+j));
//サイズ設定
jButton.setSize(100, 30);
//アクションリスナ設定
jButton.addActionListener(this);
//マップに追加
jButtonList.put(jButton,Integer.toString((i*10)+j));
//パネルに追加
fieldPanel.add(jButton);

}
}
//フレームにパネルを追加
frame.add(fieldPanel);
//表示する
frame.setVisible(true);

}
//イベントを受け取ったら
public void actionPerformed(ActionEvent e) {
//マップから表示テキストを取得してラベルに表示する
label.setText(jButtonList.get(e.getSource()));
}
}

イベントを受けて、何を表示した以下によって、
Mapに持つかArrayListに持つか、
色々方法があります。
何か判らないことがあったら補足でも結構ですので聞いてください。

質問した人からのコメント

2008/2/12 21:12:25

丁寧な書き込みありがとうございました。
非常に参考になり、とても助かりました。

ベストアンサー以外の回答

1〜1件/1件中

abc********さん

2008/2/1212:16:20

何で配列を使わないの?

JButton[][] buttons = new JButton[yoko][tate];

forループの中で1つ1つインスタンスを作ればいいんじゃないの。

buttons[i][j] = new JButton(Integer.toString(i*10+i));
filedPanel.add(buttons[i][j]);

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる