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

* イベント処理 [#n1693285]

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

&ref(GuiEventTest.java,,,GuiEventTest.java ダウンロード);/[[ソースコードファイルを見る>http://yoslab.net/netprog/source/GuiEventTest.java]]


*** 説明 [#r4b21dee]

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

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

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


*** イベントハンドラ [#g8dddc72]

- 8行目の下記の部分により,いくつかのイベントハンドラを追加しています.
 implements MouseListener,MouseMotionListener
-- 「''インタフェース''を実装している」というのですが,詳細は省きます.

-例えば38〜44行目の,''mouseClicked''メソッドは,コンポーネントがクリックされた時に呼び出されるイベントハンドラです.
-- 40行目は,クリックされたコンポーネントを取得しています.
-- 41行目は,クリックされたコンポーネントから,ボタン番号を取り出しています.
-- 42行目は,ボタン番号の前に*(アスタリスク)をつけて,クリックされたことを明示します.


|MouseListener|mouseClicked(MouseEvent e)|マウスで&color(red){クリックした};ときの処理|
|~|mouseEntered(MouseEvent e)|マウスがオブジェクトに&color(red){入った};ときの処理|
|~|mouseExited(MouseEvent e)|マウスがオブジェクトから&color(red){出た};ときの処理|
|~|mousePressed(MouseEvent e)|マウスでオブジェクトを&color(red){押した};ときの処理|
|~|mouseReleased(MouseEvent e)|マウスで押していたオブジェクトを&color(red){離した};ときの処理|
|MouseMotionListener|mouseDragged(MouseEvent e)|マウスでオブジェクトを&color(red){ドラッグしている};ときの処理|
|~|mouseMoved(MouseEvent e)|マウスがオブジェクト上で&color(red){移動した};ときの処理|

#br

|&color(red,yellow){&size(16){''よくあるミスに注意!''};};|
|インタフェースの実装により追加されたイベントハンドラは,''省略(削除)することができません''.|
|&color(red,yellow){&size(16){''よく間違えるので,もう一度書きます!''};};|
|mouseClicked(), mouseEntered(),mouseExited(), mousePressed(), mouseReleased(), mouseDragged(), mouseMoved()は''削除することができません''.|
|implementsした MouseListener,MouseMotionListenerが,それらを呼び出すので,必要だからです.|

- 

*** 確認 [#v1e6355b]

- 各マウスイベントの違いと発生タイミングについて確認しましょう.
-- 例えば,mouseClickedとmousePressedの違いに注意!

- 37行目から81行目を''コメントアウト''(&color(red){/* と */ で囲む};)して,無効化してみてください.
-- エラーが出ますね.つまり,%%%省略はできません%%%.これらの関数は必ず記述しましょう.
 
 ※最終課題に向けて…  
 余分な処理(例:「マウスが入った」などの表示)を止めたいときは
  /*
   public void mouseEntered(MouseEvent e) {
     System.out.println("マウスが入った");
   }
  */
 ではなく
   public void mouseEntered(MouseEvent e) {
     //System.out.println("マウスが入った");
   }
  としてみてください.

-- &size(15){''関数全体を消すではなく,&color(red){その中の処理};を変更してください.''};

*** 練習 [#h7c4ef3b]

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

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

&color(,yellow){ヒント2};:
- ボタンのテキストを取得して,"*"かどうかを比較しましょう!(if文を使います)
- 文字列の比較は、「==」「!=」は使えません。
- 文字列の一文字目を取る関数を利用すると良いです.
- [[演習1-4>演習1-4 文字列(String)型]]を見ましょう!

&color(,yellow){ヒント3};:
- "*"を付ける="*"を付けた文字をsetTextでセットすることです.
- "*"を外す="*"の無い文字をsetTextでセットすることです.

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

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

#br

&size(16){[[&ref(http://yoslab.net/netprog/next.gif,nolink); 次の演習(2-3)>演習2-3 画像アイコン]]};

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   一覧 単語検索 最終更新     最終更新のRSS