プロが教えるわが家の防犯対策術!

JAVA初心者です。
ある、画面にボタン50個を作成しました。(JButtonの配列で作成しました。)
そこで質問です。下記のコールバックメソッド(?)btnActionPerformedを50個分作成するのは
煩雑なので1つで処理しようと考えております。

for (int cnt=0; cnt<50; cnt++) {
...
JButtonのインスタンス生成処理等
...
btn[cnt-1].addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
btnActionPerformed(evt);
}
});
}

...
...
...

private void btnActionPerformed(java.awt.event.ActionEvent evt) {

...
}

btnActionPerformedで受け取ったevtパラメータから押されたボタンのプロパティ等
が判別つくのでしょうか?ActionEventクラスのヘルプを参照しましたが、
いまひとつ良くわかりません。
また、このevtパラメータを使う方法以外で、この様な事が実現できる方法が
あれば教えてください。よろしくお願いします。

A 回答 (4件)

やり方は二つあります。



ご指摘の通り、evtパラメータから情報を得ます。
それで、その情報を得るときに、
「getSource()で、イベントを発生したオブジェクト参照を得る」のと、
「getActionCommand()で『アクションコマンド』を得る」方法があります。

前者から説明すると、、
getSource()メソッドで
イベントを発生したオブジェクトを得ることができます。
だから、
Object source = evt.getSource();

として、
if(source == btn[i]).....;
というふうに判別します。
この方法の欠点として、「判別する側で、ボタンオブジェクトの参照を全部持ってなければならない」
という事があります。

もう一つのアクションコマンドを使う方法は、
ボタンに「アクションコマンド」というStringをセットしておいて、
evtからgetActionCommand()で取り出し、判別します。

btn[i].setActionCommand("" + i);

....

String command = evt.getActionCommand();
if(command.equals("" + j))...;

のようにします。
この方法の欠点として、事前にアクションコマンドを登録しておく必要があります。
もっとも、ボタンにテキストを表示している場合、
デフォルトではそのテキストがアクションコマンドとなります。
ボタンにテキストがあり、それぞれ違っていたらそれを使用できます。

利点としては、ボタンの参照を知らなくても処理できること、
複数のボタンから同じアクションを受け取るのが簡単なことが挙げられます。
    • good
    • 1
この回答へのお礼

良くわかりました。ありがとうございました。

お礼日時:2003/04/24 10:29

ActionListenerを無名クラスではなく、インナークラスとして定義しておいて、1ボタンにつき1インスタンスを使うようにするのはどうでしょう?



--
例えば、クラス内で↓のように定義する。

private class ButtonListener implements ActionListener {
int number;
ButtonListener(int number) {
this.number = number;
}
public void actionPerformed(ActionEvent evt) {
//numberを利用する、あるいはnumberに応じた処理
}
}

--
で、使うところでは、↓こんな感じとか。

for (int i=0; i<10; i++) {
buttons[i] = new JButton(Integer.toString(i));
buttons[i].addActionListener(new ButtonListener(i));
getContentPane().add(buttons[i]);
}

--
うまくすれば、押されたボタンの数だけevent.getSource()のif文を作る必要はなくなるのでは。
ご参考になれば。。
    • good
    • 0
この回答へのお礼

早速やってみました。内容も良く理解できました。このパターンも今後使えそうです。ありがとうございました。

お礼日時:2003/04/24 10:34

#2ですが、なぜbtnActionPerformedを定義しているのか、分からないのですが。



ボタン毎にメソッドを用意するという事なら、↓のようになります。

public void actionPerformed(ActionEvent event) {

  if(e.getSource() == btnA) {

    btnAactionPerformed(event);

  }

  else if(e.getSource() == btnB) {

    btnBactionPerformed(event);

  }

  else if(e.getSource() == btnEnd) {

    System.exit(0);

  }

}

public void btnAactionPerformed(ActionEvent e) {

  // ここにボタンAの処理を書く

}

public void btnBactionPerformed(ActionEvent e) {

  // ここにボタンBの処理をかく

}

普通は#2の様に簡単にすると思うんですが。
    • good
    • 0
この回答へのお礼

確かに良く見ると、btnActionPerformedの定義をわざわざしている理由がよくわかりませんね。マニュアルを見ると
ハンを押したように定義しているサンプルが多いので、そのままプログラミングしていました。ありがとうございました。

お礼日時:2003/04/24 10:32

こんばんは。

普通は↓のようにします。

public void actionPerformed(ActionEvent e) {

if(e.getSource() == btn1) {
// ボタン1の処理
}

else if( e.getSource() == btn2) {
// ボタン2の処理
}

else if(e.getSource() == btn3) {
// ボタン3の処理
}

else if( e.getSource() == btnEnd) {
System.exit(0);
}

}

btnEndというのは、終了ボタンです。。。
    • good
    • 0

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