• ベストアンサー

イベントが発生したボタンを特定する方法

たとえば、ボタンが配列でたくさん存在する場合 そのうちのどれかひとつが押されてイベントが発生して、ActionPerformed()が呼ばれますが ここでどのボタンが押されたかを瞬時に特定する方法はありませんか? とりあえずはActionEvent.getSource()でできますが、ボタンが大量にある場合にはたとえFor文などを使っても効率が悪い気がします。 何か良い方法はありませんでしょうか?

  • siois
  • お礼率60% (53/88)
  • Java
  • 回答数2
  • ありがとう数2

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

  • ベストアンサー
  • akiras
  • ベストアンサー率100% (1/1)
回答No.1

ボタンを特定したあとは具体的に何をするのでしょうか? たとえばSQLのWHERE条件にいれるとかであれば、getActionCommandを使えば特にループする必要はないと思います。 private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { String sql = "SEECT * FROM SampleTable WHERE TelNo='" evt.getActionCommand + "'" }

siois
質問者

お礼

ありがとうございます!! ActionCommandこそ探していたものでした! 助かりました!!

その他の回答 (1)

  • HarukaV49
  • ベストアンサー率53% (48/89)
回答No.2

具体的な処理の内容が分からないので、あくまでも一般論ですが。 if( event.getSource() == button1 ) {  ... else if( event.getSource() == button2 ) {  ... else if( event.getSource() == button3 ) {  ... } この様に、ボタンオブジェクトを識別して、完全に独立した処理を 実装する場合には、各ボタンに応じて個別のイベントクラスを 提供する方法がオブジェクト指向設計的に優れています。 また、ボタンコンポーネントのサブクラスを作成して  ((OriginalButton)event.getSource()).getOriginalID() というようなメソッドを持たせる方法が有効な場合も多々あります。 具体例を挙げると、ゲームのマインスイーパーのように、ボタンの 位置が識別できるだけで良く、処理内容が同一な時などです。

siois
質問者

お礼

ご回答ありがとうございます!! はじめはgetSourceでやっていたのですが、ボタンが40個ほどあるため40個もの条件分けなどやっていられませんで、別の方法を探していたところでした。 ActionCommandなるString型変数があったみたいなのでそっちで試してみます。 どうもありがとうございました。

関連するQ&A

  • 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の中身の所でつまづいております。 ご存知の方おりましたらご指導願います。

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

    • ベストアンサー
    • Java
  • [java]クローズボックスを閉じたときのActionEvent

    クローズボックスを閉じたときのActionEventを 拾いたいのですが、IF文はどう記述すべきでしょうか? public void actionPerformed(ActionEvent e) { if(/**ここが分からない**/){ System.out.println("閉じるボタンを押した"); } }

    • ベストアンサー
    • Java
  • SPREADコマンドボタン発生イベントについて

    突然申し訳ありませんが質問させてください。 SPREAD3.0の先頭列にコマンドボタンをデザインし、 (行数分ボタンが存在する。)動作させたのですが、 クリック対象ボタンにフォーカスがすでに移動して いた場合にクリックイベントが発生しませんでした。 他の、ボタンやセルにフォーカスを移動させ再度 クリックするとイベント発生します。 これは、スプレッドに対する設定のせいなので しょうか? それとも、バグなのでしょうか?もし、バグであれば 対策法があればご教授願います。 よろしくお願いします。

  • .NETで動的にボタンイベントを生成する方法

    TextBoxに入力された値の数だけ ボタンを生成したいのですが、 配列(ArrayList)にオブジェクト名を追加し、 For Eachで全件処理をしてもボタンのオブジェクト 名がうまく宣言できず生成したボタンに対し、 色の設定ができません。 .NETのバージョンは2003で、Frameworkのバージョンが1.0です。 良い解決方法があれば教えてください。

  • ボタン押したときにすでに表示されている画面の再表示を禁止したい。

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

  • 一つにまとめたい

    最近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
  • VBAでイベント発生時に自分の呼ばれたコマンドを知る方法

    イベントが発生したときに自分がどのオブジェクトから呼ばれているイベントか知る方法ってありますか?あるいは上から何番目のコマンド(縦に同じコマンドがズラッと並んでいるイメージ)から呼ばれているかをイベント内部から知る方法ってありますか? 今コーディングで新規フォームを作ってそこにレコード数だけコントロールを配置するというコーディングを考えております。 そのコマンドにクリックイベントも発生させたいので、コントロールを作成してイベントを埋め込むという作業まではできたのですが、不特定多数のコマンドボタンの作成設置方法に悩んでおります。 VBAではコントロールの配列はできないので、コントロールの名前などを全て変えて作らなければなりません。そこをどうするかで頭を悩ませています。 しかも後でどのコントロールがクリックされて呼ばれたのかも知りたいので、コントロール配列のindex番号みたいなものを取得しておく必要もありますが、何か良い方法はないでしょうか? いっそのことコマンドの名前を数字にして、後でそのコントロール名とかオブジェクトのメソッドを参照してインデックス番号を取得・・・みたいなことを考えてたのですが、たしか既存の(目に見えて形となっている)(オブジェクト名自体を持っている)コントロールのメソッドを使用するのはかなり不可能だったような気がするので、タグやオブジェクト名も拾えない気がします。 VBなら同じイベント内容のコマンドを全て配列にしてまとめてクリックイベントにしてそのIndexを見ればプロシージャ1つで済みますが、VBAで似たような方法をする方法を教えてください。 ループで回しながらオブジェクト名の違うコントロールを配置する方法は自分でなんとかやってみますのでindex番号の取得の方法だけお願いします。

  • C#イベントで作る変数の受け渡し

    c#初心者なので、教えて下さい。  Windowsのフォームアプリケーションです。例えば、あるボタンのクリックイベントにファイルをよむを登録する、とします。この場合はイベントで定義した文字列の配列だとします。そこへ読み込みます。  この配列を使って、加工を行う場合は、ローカルな変数になるので、そのイベントが終了してしまえば、配列は存在しないと思います。  C#ではグローバル変数という物はないそうです。擬似的に作ることは出来るようですが、普通の場合はどうすれば、これを回避できますか?  擬似的グローバル変数を作ったとしても、修飾が付いて見にくいし、ローカルで動的に確保した配列は、大きさが変わるので、呼ぶ側の方で確保しようにも、大体の大きさぐらいで、正確に確保できないように思います。  どうしたらスマートに解決できますか?

  • キーボードのアクション

    スタートボタンでtimerをスタートさせ、 キーボードの「↑」ボタンを押すとFrame上の○がジャンプをする。 というプログラムを作りたいのですができません。 エラーが出てしまいます。どうしてででしょうか? ActionListenerのところのソースは public void actionPerformed (ActionEvent e) { //記録開始ボタンが押された if(e.getSource() == StartB) { timer.start(); } //キーボード読み込み com = e.getActionCommand(); if(com.equals("jump")) { //ジャンプの状態へ State = 1; } //再描写 repaint(); } です。