• ベストアンサー

JButton配列でのイベント処理

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パラメータを使う方法以外で、この様な事が実現できる方法が あれば教えてください。よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • liar_adan
  • ベストアンサー率48% (730/1515)
回答No.1

やり方は二つあります。 ご指摘の通り、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))...; のようにします。 この方法の欠点として、事前にアクションコマンドを登録しておく必要があります。 もっとも、ボタンにテキストを表示している場合、 デフォルトではそのテキストがアクションコマンドとなります。 ボタンにテキストがあり、それぞれ違っていたらそれを使用できます。 利点としては、ボタンの参照を知らなくても処理できること、 複数のボタンから同じアクションを受け取るのが簡単なことが挙げられます。

Vargas
質問者

お礼

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

その他の回答 (3)

  • thelma
  • ベストアンサー率66% (20/30)
回答No.4

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文を作る必要はなくなるのでは。 ご参考になれば。。

Vargas
質問者

お礼

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

回答No.3

#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の様に簡単にすると思うんですが。

Vargas
質問者

お礼

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

回答No.2

こんばんは。普通は↓のようにします。 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というのは、終了ボタンです。。。

関連するQ&A