TopPage > 演習課題 > 演習2-2 イベント処理

イベント処理

まず,下記のプログラムをダウンロードしてください.

fileGuiEventTest.java ダウンロードソースコードファイルを見る

説明

このプログラムは,演習2-1のプログラムにイベント処理の機能を実装したものです. (名前入力機能など一部を省略しています)

イベントとは,Javaプログラム上でマウスやキーボードを操作したことを指しており,イベントが発生すると,イベントリスナー(イベントハンドラ)と呼ばれるメソッドが,イベントに応じた処理を実行します.

  • 26〜27行目:各ボタンに対して,マウスイベントのリスナーを設定している.
  • 28行目:各ボタンに対して,ボタンの番号を格納している.

イベントハンドラ

  • 8行目の下記の部分により,いくつかのイベントハンドラを追加しています.
    implements MouseListener,MouseMotionListener
    • インタフェースを実装している」というのですが,詳細は省きます.
  • 例えば38〜44行目の,mouseClickedメソッドは,コンポーネントがクリックされた時に呼び出されるイベントハンドラです.
    • 40行目は,クリックされたコンポーネントを取得しています.
    • 41行目は,クリックされたコンポーネントから,ボタン番号を取り出しています.
    • 42行目は,ボタン番号の前に*(アスタリスク)をつけて,クリックされたことを明示します.
MouseListenermouseClicked(MouseEvent e)マウスでクリックしたときの処理
mouseEntered(MouseEvent e)マウスがオブジェクトに入ったときの処理
mouseExited(MouseEvent e)マウスがオブジェクトから出たときの処理
mousePressed(MouseEvent e)マウスでオブジェクトを押したときの処理
mouseReleased(MouseEvent e)マウスで押していたオブジェクトを離したときの処理
MouseMotionListenermouseDragged(MouseEvent e)マウスでオブジェクトをドラッグしているときの処理
mouseMoved(MouseEvent e)マウスがオブジェクト上で移動したときの処理
 
よくあるミスに注意!
インタフェースの実装により追加されたイベントハンドラは,省略(削除)することができません
よく間違えるので,もう一度書きます!
mouseClicked(), mouseEntered(),mouseExited(), mousePressed(), mouseReleased(), mouseDragged(), mouseMoved()は削除することができません
implementsした MouseListener,MouseMotionListenerが,それらを呼び出すので,必要だからです.

確認

  • 各マウスイベントの違いと発生タイミングについて確認しましょう.
    • 例えば,mouseClickedとmousePressedの違いに注意!
  • 37行目から81行目をコメントアウト/* と */ で囲む)して,無効化してみてください.
    • エラーが出ますね.つまり,省略はできません.これらの関数は必ず記述しましょう.
      ※最終課題に向けて…  
      余分な処理(例:「マウスが入った」などの表示)を止めたいときは
       /*
        public void mouseEntered(MouseEvent e) {
          System.out.println("マウスが入った");
        }
       */
      ではなく
        public void mouseEntered(MouseEvent e) {
          //System.out.println("マウスが入った");
        }
       としてみてください.
  • 関数全体を消すではなく,その中の処理を変更してください.

練習

アスタリスクマーク(*)のついたボタンを再度クリックすると,アスタリスクが消えるようにプログラムを変更してください.

ヒント1

  • JButtonオブジェクトで使用できるgetText()を使うと,ボタンのテキストを取得できます.(String型の文字が取得できます)
    • 例)) 「JButton型のtheButton」に書いてある文字列が取得したい⇒theButton.getText();
  • 「*マークがあるかどうか」でボタンのテキストを上書きしたいですね.
    • この判定には,いくつか方法があります.
    • ボタンの配列番号や,ボタンのテキストを用いて,よく考えてみましょう.

ヒント2

  • ボタンのテキストを取得して,"*"かどうかを比較しましょう!(if文を使います)
  • 文字列の比較は、「==」「!=」は使えません。
  • 文字列の一文字目を取る関数を利用すると良いです.
  • 演習1-4を見ましょう!

ヒント3

  • "*"を付ける="*"を付けた文字をsetTextでセットすることです.
  • "*"を外す="*"の無い文字をsetTextでセットすることです.

どのボタンをクリックしたか区別はどうしているのか?

  • どのボタンをクリックしたかは,どうやって調べているのでしょうか?
  • ちょっとしたトリック?を使って,実現しています.
  • 「ボタンを生成」するときに,下記の命令で,ボタンに配列の情報(何番目の配列か,インデックスの情報)を,文字として付けています.
    • buttonArray[i].setActionCommand(Integer.toString(i));//ボタンに配列の情報を付加する
  • クリックされたボタンでは,下記のプログラムで,その情報を取り出しています.
    • String theArrayIndex = theButton.getActionCommand();//ボタンの配列の番号を取り出す
  • このような仕組みで,どのボタンをクリックしたかを調べることができるようにしています.
  • setActionCommand()とgetActionCommand()は,文字のデータを付けることができます
  • このプログラムでは,Integer.toString(i)関数で,配列の数字を一度文字に変換しています.
  • 配列の番号として利用するときには,数字にする必要があります.

マウスイベントはどこからくるのか?

  • 「mouseClicked」「mouseEntered」は,関数(メソッド)ですが,いったい,どこから呼ばれているのでしょうか?
  • 実は,プログラムの上部にある,implements MouseListener,MouseMotionListenerの中にマウスのイベントが呼ばれる部分が含まれていて, プログラムの中にはみえないようになっています.なので,ちょっと不思議な感じがします.
  • MouseListener,MouseMotionListenerのプログラムの指示として,どのオブジェクト(ボタンなどが), マウスイベント受け取るかについて,「add」をして,決定しています.
  • 「.addMouseListener(this)」を呼んで,設定しています.
 

next.gif 次の演習(2-3)


添付ファイル: fileGuiEventTest.java 2050件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   一覧 単語検索 最終更新     最終更新のRSS
Last-modified: 2018-10-25 (木) 11:58:19 (2003d)