• ベストアンサー

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

  • Vargas
  • お礼率85% (174/204)
  • Java
  • 回答数4
  • ありがとう数4

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

  • ベストアンサー
  • 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

  • 一つにまとめたい

    最近JAVAプログラミングをやりはじめました。 netbeansで作成しています。 文章を入力し、ドラッグしてもらい格納ボタンを押すと下に表示されます。 ドラッグした文字でいいならOKボタンを押します。 押すと配列に格納されます。 表示を押すと配列の中身が見えます(これは少し適当な作りですが) 今の段階ではこれでうまくいきます。ですがどの配列に入れるか選択したい場合に困っています。 「配列2に格納」というボタンを作った場合、配列2に格納するようにするにはどうすればよいでしょうか? 今の段階では「配列に格納」というボタンは実際はドラッグした文字しか表示していませんが、本来は複数のボタンを配置してボタンにより動作を変えたいのです。ただ同じものを使いたいのです。わざわざ別のボタンやテキストエリアを作るのは無駄ですし。 ただ色々試してもエラーが出てしまい実行できずにいます。 ソースを載せておきます。お願いします。 package javaapplication5; public class sample11 extends javax.swing.JFrame { int i=0; String word1; String[] test = new String[10]; /** Creates new form sample11 */ public sample11() { initComponents(); } @SuppressWarnings("unchecked") private void initComponents() { word = new javax.swing.JTextField(); jButton1 = new javax.swing.JButton(); SelectWord = new javax.swing.JTextField(); Ok = new javax.swing.JButton(); jLabel1 = new javax.swing.JLabel(); Show = new javax.swing.JButton(); jScrollPane1 = new javax.swing.JScrollPane(); ShowResult = new javax.swing.JTextArea(); setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); word.setText("文章を入力"); jButton1.setText("配列に格納"); jButton1.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jButton1ActionPerformed(evt); } }); Ok.setText("OK"); Ok.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { OkActionPerformed(evt); } }); jLabel1.setText("で構いませんか?"); Show.setText("表示"); Show.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { ShowActionPerformed(evt); } }); ShowResult.setColumns(20); ShowResult.setRows(5); jScrollPane1.setViewportView(ShowResult); (文字数の都合でここにあったレイアウトに関する記述は削除しました) private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton1ActionPerformed word1 = word.getSelectedText(); SelectWord.setText(word1); } private void OkActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_OkActionPerformed test[i] = SelectWord.getText(); ++i; }//GEN-LAST:event_OkActionPerformed private void ShowActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_ShowActionPerformed for(int j=0;j<i;j++){ ShowResult.setText(ShowResult.getText()+test[j]+"\n"); } } public static void main(String args[]) { java.awt.EventQueue.invokeLater(new Runnable() { public void run() { new sample11().setVisible(true); } }); } private javax.swing.JButton Ok; private javax.swing.JTextField SelectWord; private javax.swing.JButton Show; private javax.swing.JTextArea ShowResult; private javax.swing.JButton jButton1; private javax.swing.JLabel jLabel1; private javax.swing.JScrollPane jScrollPane1; private javax.swing.JTextField word; // End of variables declaration }

    • ベストアンサー
    • Java
  • JavaAppletのイベントの強制発生方法

    JavaAppletのイベント処理についてお伺いしたい事があります。 Appletで作成した画面にボタンAを設置し、 actionPerformedのイベントを作成しました。 private void ボタンA_actionPerformed (java.awt.event.ActionEvent ae) {   //処理内容 } ボタンAを押下すると上記のイベントが呼ばれ正常に動作するのですが、このイベント処理をボタンAを押下する以外の方法で呼び出す事は可能なのでしょうか? 下記内容は例として、ボタンBで[F1]が押されたらボタンAの押下処理を呼び出そうとしております。 private void ボタンB_keyPressed (java.awt.event.KeyEvent ke) {   java.awt.event.ActionEvent ae;   ae = ○○○○○○;   if (e.getKeyCode() == java.awt.event.KeyEvent.VK_F1) {     ボタンA_actionPerformed(ae);   } } java.awt.event.ActionEventで定義した変数aeの中身の所でつまづいております。 ご存知の方おりましたらご指導願います。

  • event処理の初期化について

    クリックすると数字が1つづ増えていく処理はできるのですが、 別ボタンをクリックすると、最初の0に戻したいのですがどのようにすればいいのでしょうか・・ 仮に、b.setText("0");として0が表示できたとしても、そのあと上の増幅ボタンを押すとそれまで増えていた数から1ずつ増えてしまいます つまり、リセットする!というようなことをしたいのですが考え方も方法もわからないのです。どなたかご回答よろしくお願いいたします import java.awt.*; import java.awt.event.*; class click_a extends Frame{ Button a1,a2; Label b; Panel c; int d=0; click_a(){ setSize(300,300); setVisible(true); a1=new Button("ボタンを押すと数字が足し算されます"); a2=new Button("初期値に戻します"); b=new Label(""+d); c=new Panel(); c.setLayout(new GridLayout(3,1)); add(c); c.add(a1); c.add(a2); c.add(b); a1.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e){ b.setText(""+d); d++; } }); a2.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e){ b.setText("0"); } }); } public static void main(String[] args){ new click_a(); } }

    • ベストアンサー
    • Java
  • main()メソッドが無いコード

    最近、Javaアプレット等を勉強してるのですが 今まではmain()メソッドの中に処理を書いて来たのですが、 下記の様なコードにはmain()メソッドが有りません。 import java.applet.Applet; import java.awt.Button; import java.awt.event.ActionListener; import java.awt.event.ActionEvent; public class Sample6 extends Applet implements ActionListener { Button bt; public void init() { bt = new Button("開始"); add(bt); bt.addActionListener(this); } public void actionPerformed(ActionEvent ae) { bt.setLabel("中止"); } } これはどう言う事なんでしょうか?

    • ベストアンサー
    • Java
  • ボタン押したときにすでに表示されている画面の再表示を禁止したい。

    以下のプログラムで別画面の表示を行います。 private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { JFrame re = new Set(); re.setVisible(true); } しかしこのプログラムではボタンを押す度に別画面を表示されてしまします。 同じ画面を開くことを禁止するにはどのようにすれば良いでしょうか?

  • イベントの宣言について

    public class J_applet extends Applet implements ActionListener ,ItemListener { と宣言したところ、 J_applet は abstract でなく、java.awt.event.ActionListener 内の abstract メソッド actionPerformed(java.awt.event.ActionEvent) をオーバーライ ドしません。 とエラーがでました。 インポート宣言はきちんとしました。 上記のような書き方はもしかして出来ないんでしょうか?

    • ベストアンサー
    • Java
  • コンパイルエラーの対応

    下記のプログラムをコンパイルしたらエラーが発生しました。 プログラム自体は本をそのまま書き写したのですが、何がいけないのでしょう。 教えてください。よろしくお願いします。 Javaのバージョンは1.3.1です import java.applet.*; import java.awt.*; import java.awt.event.*; public class sample3 extends Applet implements ActionListener { Button bt; public void init() { bt = new Button("押します!"); bt.addActionListener(this); add(bt); } public void actionperformed(ActionEvent ae) { bt.setLabel("押しました!"); } } -----------------エラー内容----------------------- sample3.java:4: sample3 は abstract として宣言する必要があります。 actionPerformed(java.awt.event.ActionEvent) を sample3 で定義しません。 public class sample3 extends Applet implements ActionListener ^

    • ベストアンサー
    • Java
  • イベント処理がうまくいきません。

    java初心者です。 スタートボタンをクリックするとトランプ52枚表示されるようにしたいのですが、 1枚も表示されず、原因もよく分からないため苦労してます。 よろしくお願い致します。 以下は、プログラムです。 import java.awt.Color; import java.awt.Dimension; import java.awt.*; import javax.swing.*; import java.io.*; import javax.imageio.*; import java.awt.Graphics; import java.awt.Font; import javax.swing.JButton; import java.awt.Container; import java.awt.event.ActionListener; import java.awt.event.ActionEvent; import javax.swing.JFrame; import javax.swing.JPanel; import java.awt.event.*; public class narabi2 extends JPanel{ JButton btn1,btn2,btn3; static Image img[] = new Image[52]; public static void main(String[] args) { JFrame f = new JFrame(); f.setDefaultCloseOperation(f.EXIT_ON_CLOSE); f.setResizable(true); f.setVisible(true); new narabi2(); } public narabi2(){ btn1 = new JButton("スタート"); this.add(btn1); btn1.addActionListener(new ev()); btn2 = new JButton("ランキング"); this.add(btn2); btn2.addActionListener(new ev()); btn3 = new JButton("ログアウト"); this.add(btn3); btn3.addActionListener(new ev()); JFrame f = new JFrame(); f.setSize(900,840); f.getContentPane().setBackground(new Color(0,100,0)); f.setDefaultCloseOperation(f.EXIT_ON_CLOSE); f.setResizable(true); f.setVisible(true); f.add(this); } public void paintComponent(Graphics g){ super.paintComponent(g); btn1 = new JButton("スタート"); this.add(btn1); btn1.addActionListener(new ev()); btn2 = new JButton("ランキング"); this.add(btn2); btn2.addActionListener(new ev()); btn3 = new JButton("ログアウト"); this.add(btn3); btn3.addActionListener(new ev()); setBackground(new Color(0,100,0)); int i;               //カードを並べる処理 int x = 0,y=0; for (i = 0; i < 52; i++) { g.drawImage(img[i], x, y, null); x = x + 100; if(x>=900){ x=0; y=y+140; } } } class ev implements ActionListener{ public void actionPerformed(ActionEvent m){ if(m.getSource()==btn1) //スタート { //public static void main(String[] args) { // 画像ファイルの読み込み int i, j; int no = 0; String c[] = {"s","h","c","d"}; try { for(i = 0; i < 4; i++) { for(j = 1; j <= 13; j++) { //String filename = "cards.png"; String filename = String.format("cards/%s%02d.png", c[i], j); img[no] = ImageIO.read(new File(filename)); no++; } } } catch(Exception e) { System.out.println(e); System.exit(0); } // シャッフル Image w; for (i = 51; i >= 0; i--) { j = (int)(Math.random() * (i + 1)); w = img[i]; img[i] = img[j]; img[j] = w; } } /*public void paintComponent(Graphics g) { super.paintComponent(g); int i; int x = 0,y=0; for (i = 0; i < 52; i++) { g.drawImage(img[i], x, y, null); x = x + 100; if(x>=900){ x=0; y=y+140; } } }*/ } /*else if(m.getSource()==btn2) //ランキング { } else if(m.getSource()==btn3) //ログアウト { } }*/ } }

  • Buttonを配列とすることができるでしょうか

    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の値をしらべれば、どのボタンがクリックされたかわかるとかんがえたのですが。実行時にエラーとなってしまいます。なにか良い方法はありませんか。

  • HTMLファイルを開きたい

    こんにちは、いつもお世話になっています。 質問があります。 アプレットでボタンを押すと、 HTMLファイル「c:/test_folder/test.html」 を開きたいのですが、 下記コードの(☆) のところに何を書いていいかわかりません。 どなたかご存知でしたら教えていただけないでしょうか? よろしくお願いします。 ============================================================= import javax.swing.*; import java.awt.*; import java.applet.Applet; import java.awt.event.*; import java.net.*; public class situmon extends Applet implements ActionListener { JPanel panel; JButton button; public void init() { panel=new JPanel(); button=new JButton("次へ"); button.addActionListener(this); panel.add(button); this.add(panel); } public void actionPerformed(ActionEvent e) { if(e.getSource()==button) { (☆); } } }

    • ベストアンサー
    • Java

専門家に質問してみよう