<?xml version="1.0" encoding="utf-8"?><!DOCTYPE article  PUBLIC '-//OASIS//DTD DocBook XML V4.4//EN'  'http://www.docbook.org/xml/4.4/docbookx.dtd'><article><articleinfo><title>イベントドリブン</title><revhistory><revision><revnumber>30</revnumber><date>2010-12-18 12:54:39</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>29</revnumber><date>2010-12-13 06:46:53</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>28</revnumber><date>2010-12-13 06:45:19</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>27</revnumber><date>2009-12-09 00:48:29</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>26</revnumber><date>2009-12-09 00:47:35</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>25</revnumber><date>2009-12-09 00:46:56</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>24</revnumber><date>2009-12-09 00:44:17</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>23</revnumber><date>2009-12-04 03:05:03</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>22</revnumber><date>2009-12-04 03:04:42</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>21</revnumber><date>2009-12-04 03:03:38</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>20</revnumber><date>2009-12-04 02:47:28</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>19</revnumber><date>2009-12-04 02:45:20</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>18</revnumber><date>2009-12-04 02:33:51</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>17</revnumber><date>2009-12-04 02:33:15</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>16</revnumber><date>2009-12-04 02:29:58</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>15</revnumber><date>2009-12-04 02:13:37</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>14</revnumber><date>2009-12-04 02:11:00</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>13</revnumber><date>2009-12-04 01:59:34</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>12</revnumber><date>2009-12-04 01:54:28</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>11</revnumber><date>2009-12-04 01:53:31</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>10</revnumber><date>2009-12-04 01:50:07</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>9</revnumber><date>2009-12-04 01:44:28</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>8</revnumber><date>2009-12-04 01:43:05</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>7</revnumber><date>2009-12-04 01:33:37</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>6</revnumber><date>2009-12-04 01:29:58</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>5</revnumber><date>2009-12-04 01:28:06</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>4</revnumber><date>2009-12-04 01:23:57</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>3</revnumber><date>2009-12-04 01:20:38</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>2</revnumber><date>2009-12-04 01:15:39</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>1</revnumber><date>2009-12-04 01:11:38</date><authorinitials>masahiko</authorinitials></revision></revhistory></articleinfo><section><title>イベントドリブン</title><para>GUI用いたプログラムは複数のスレッドで動作しています。 </para><para>ボタンを押すなどのアクションやイベントに対して処理が行われます。 </para><itemizedlist><listitem override="none"><para><inlinemediaobject><imageobject><imagedata fileref="http://ei-www.hyogo-dai.ac.jp/~masahiko/moin.cgi/%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88%E3%83%89%E3%83%AA%E3%83%96%E3%83%B3?action=AttachFile&amp;do=get&amp;target=event1.png"/></imageobject><textobject><phrase>event1.png</phrase></textobject></inlinemediaobject> </para></listitem></itemizedlist><para>イベントが発生するとその情報はイベントキューに入れられ、 イベントの内容に対応するイベントリスナに処理を委ねられます。 </para><!--rule (<hr>) is not applicable to DocBook--><section><title>インターフェース</title><para>リスナを作成するにはインターフェースを利用します。 </para><itemizedlist><listitem override="none"><para>インターフェースは実体の無いクラスと考えられます。 </para></listitem><listitem override="none"><para>インターフェースはクラス図では点線を使って表します。  </para></listitem><listitem override="none"><para><inlinemediaobject><imageobject><imagedata fileref="http://ei-www.hyogo-dai.ac.jp/~masahiko/moin.cgi/%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88%E3%83%89%E3%83%AA%E3%83%96%E3%83%B3?action=AttachFile&amp;do=get&amp;target=interface.png"/></imageobject><textobject><phrase>interface.png</phrase></textobject></inlinemediaobject> </para></listitem></itemizedlist><para>インターフェースでは、どのようなメソッドが必要かなどインターフェースだけが指定されています。 </para><para>インターフェースを継承してクラスを作成するときには、 インターフェースで指定されているメソッドをすべて記述しなければなりません。 これを<emphasis role="strong">実装</emphasis>といいます。 </para><!--rule (<hr>) is not applicable to DocBook--></section><section><title>例</title><para>画像を表示するプログラムにマウスイベントを追加します。 </para></section><section><title>クラスの定義</title><para>作成するクラスでは利用したい機能がJPanelとMouseListenerの２つのクラスにあります。 </para><itemizedlist><listitem override="none"><para><inlinemediaobject><imageobject><imagedata fileref="http://ei-www.hyogo-dai.ac.jp/~masahiko/moin.cgi/%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88%E3%83%89%E3%83%AA%E3%83%96%E3%83%B3?action=AttachFile&amp;do=get&amp;target=event2.png"/></imageobject><textobject><phrase>event2.png</phrase></textobject></inlinemediaobject> </para></listitem></itemizedlist><para>Javaではスーパークラスとして指定できるのは１つだけです。 </para><itemizedlist><listitem override="none"><para>JPanelクラスを継承することは次のように書きました。 </para><itemizedlist><listitem override="none"><para>extends JPanel </para></listitem></itemizedlist></listitem><listitem override="none"><para>インターフェースは次のように実装の指定として書きます。 </para><itemizedlist><listitem override="none"><para>implements MouseListener </para></listitem></itemizedlist></listitem><listitem override="none"><para>MouseListenerはjava.awt.eventパッケージ内にあります。 </para><screen><![CDATA[ import java.awt.event.*;
 public class Sample6 extends JPanel implements MouseListener
 {
    ...
 }]]></screen></listitem></itemizedlist><!--rule (<hr>) is not applicable to DocBook--></section><section><title>リスナの指定</title><para>このインスタンスがマウスイベントのリスナとなることを指定するために次のように記述します。 </para><itemizedlist><listitem override="none"><para>addMouseListener(this); </para></listitem></itemizedlist><para>インスタンスが作成されたときに一度指定すればよいので、コンストラクタ内に記述します。 </para><itemizedlist><listitem override="none"><screen><![CDATA[ Sample6()
 {
    ...
    addMouseListener(this);
 }]]></screen></listitem></itemizedlist><!--rule (<hr>) is not applicable to DocBook--></section><section><title>メソッドの記述</title><para>MouseListenerを実装するときには次の５つのメソッドを記述しなければなりません。 </para><itemizedlist><listitem><para>mouseClicked </para></listitem><listitem><para>mouseEntered </para></listitem><listitem><para>mouseExited </para></listitem><listitem><para>mousePressed </para></listitem><listitem><para>mouseReleased  </para></listitem></itemizedlist><para>対応する処理が不必要な場合は本体が空のメソッドとして定義します。 </para><para>引数や型は後ろのサンプルを見て下さい。 </para><!--rule (<hr>) is not applicable to DocBook--></section><section><title>演習(続き)</title><para>drawImageメソッドを使って画像の一部をウインドウ内の一部に表示しましたが、 表示位置を変数px,pyで指定するように修正しなさい。 </para><itemizedlist><listitem override="none"><para><inlinemediaobject><imageobject><imagedata fileref="http://ei-www.hyogo-dai.ac.jp/~masahiko/moin.cgi/%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88%E3%83%89%E3%83%AA%E3%83%96%E3%83%B3?action=AttachFile&amp;do=get&amp;target=event3.png"/></imageobject><textobject><phrase>event3.png</phrase></textobject></inlinemediaobject> </para></listitem></itemizedlist><para>そのためにpx,pyをインスタンス変数として宣言し、初期化しておきます。 </para><itemizedlist><listitem override="none"><para>下のサンプルを参照。 </para></listitem></itemizedlist><para>mousePressedメソッドの本体に２行追加します。 </para><itemizedlist><listitem><para>px = px + 5; </para></listitem><listitem override="none"><para>表示位置を指定する変数の値を５増やしています。 </para></listitem><listitem><para>repaint(); </para></listitem><listitem override="none"><para>イベントキューに再描画を依頼するイベントを送ります。 </para></listitem><listitem override="none"/><listitem override="none"><para><inlinemediaobject><imageobject><imagedata fileref="http://ei-www.hyogo-dai.ac.jp/~masahiko/moin.cgi/%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88%E3%83%89%E3%83%AA%E3%83%96%E3%83%B3?action=AttachFile&amp;do=get&amp;target=event4.png"/></imageobject><textobject><phrase>event4.png</phrase></textobject></inlinemediaobject> </para></listitem></itemizedlist><para>以上でマウスのボタンを押したら画像の表示位置が右に５ドットずつずれるようになります。 </para><para>もとの位置にも画像が残ってしまいますが、このままでかまいません。 </para><itemizedlist><listitem override="none"><programlisting format="linespecific" language="java" linenumbering="numbered" startinglinenumber="1"><![CDATA[ ]]><token><![CDATA[import]]></token><![CDATA[ ]]><methodname><![CDATA[javax.swing.*]]></methodname><![CDATA[;]]>
<![CDATA[ ]]><token><![CDATA[import]]></token><![CDATA[ ]]><methodname><![CDATA[java.awt.*]]></methodname><![CDATA[;]]>
<![CDATA[ ]]><token><![CDATA[import]]></token><![CDATA[ ]]><methodname><![CDATA[java.awt.event.*]]></methodname><![CDATA[;]]>
<![CDATA[ ]]>
<![CDATA[ ]]><token><![CDATA[public]]></token><![CDATA[ ]]><token><![CDATA[class]]></token><![CDATA[ ]]><methodname><![CDATA[Sample6]]></methodname><![CDATA[ ]]><token><![CDATA[extends]]></token><![CDATA[ ]]><methodname><![CDATA[JPanel]]></methodname><![CDATA[ ]]><token><![CDATA[implements]]></token><![CDATA[ ]]><methodname><![CDATA[MouseListener]]></methodname>
<![CDATA[ {]]>
<![CDATA[        ]]><token><![CDATA[int]]></token><![CDATA[ ]]><methodname><![CDATA[px]]></methodname><![CDATA[;]]>
<![CDATA[        ]]><token><![CDATA[int]]></token><![CDATA[ ]]><methodname><![CDATA[py]]></methodname><![CDATA[;]]>
<![CDATA[        ...]]>
<![CDATA[        ]]>
<![CDATA[        ]]><methodname><![CDATA[Sample6]]></methodname><![CDATA[()]]>
<![CDATA[        {]]>
<![CDATA[                ...]]>
<![CDATA[                ]]><methodname><![CDATA[px]]></methodname><![CDATA[ = 50;]]>
<![CDATA[                ]]><methodname><![CDATA[py]]></methodname><![CDATA[ = 100;]]>
<![CDATA[                ]]><methodname><![CDATA[addMouseListener]]></methodname><![CDATA[(]]><token><![CDATA[this]]></token><![CDATA[);]]>
<![CDATA[        }]]>
<![CDATA[        ]]>
<![CDATA[        ]]><token><![CDATA[public]]></token><![CDATA[ ]]><token><![CDATA[void]]></token><![CDATA[ ]]><methodname><![CDATA[paintComponent]]></methodname><![CDATA[(]]><methodname><![CDATA[Graphics]]></methodname><![CDATA[ ]]><methodname><![CDATA[g]]></methodname><![CDATA[)]]>
<![CDATA[        {]]>
<![CDATA[                ...]]>
<![CDATA[        }]]>
<![CDATA[        ]]>
<![CDATA[        ]]><token><![CDATA[public]]></token><![CDATA[ ]]><token><![CDATA[void]]></token><![CDATA[ ]]><methodname><![CDATA[mousePressed]]></methodname><![CDATA[(]]><methodname><![CDATA[MouseEvent]]></methodname><![CDATA[ ]]><methodname><![CDATA[e]]></methodname><![CDATA[)]]>
<![CDATA[        {]]>
<![CDATA[                ]]><methodname><![CDATA[px]]></methodname><![CDATA[ = ]]><methodname><![CDATA[px]]></methodname><![CDATA[ + 5;]]>
<![CDATA[                ]]><methodname><![CDATA[repaint]]></methodname><![CDATA[();]]>
<![CDATA[        }]]>
<![CDATA[        ]]>
<![CDATA[        ]]><token><![CDATA[public]]></token><![CDATA[ ]]><token><![CDATA[void]]></token><![CDATA[ ]]><methodname><![CDATA[mouseEntered]]></methodname><![CDATA[(]]><methodname><![CDATA[MouseEvent]]></methodname><![CDATA[ ]]><methodname><![CDATA[e]]></methodname><![CDATA[) { }]]>
<![CDATA[        ]]><token><![CDATA[public]]></token><![CDATA[ ]]><token><![CDATA[void]]></token><![CDATA[ ]]><methodname><![CDATA[mouseExited]]></methodname><![CDATA[(]]><methodname><![CDATA[MouseEvent]]></methodname><![CDATA[ ]]><methodname><![CDATA[e]]></methodname><![CDATA[) { }]]>
<![CDATA[        ]]><token><![CDATA[public]]></token><![CDATA[ ]]><token><![CDATA[void]]></token><![CDATA[ ]]><methodname><![CDATA[mouseReleased]]></methodname><![CDATA[(]]><methodname><![CDATA[MouseEvent]]></methodname><![CDATA[ ]]><methodname><![CDATA[e]]></methodname><![CDATA[) { }]]>
<![CDATA[        ]]><token><![CDATA[public]]></token><![CDATA[ ]]><token><![CDATA[void]]></token><![CDATA[ ]]><methodname><![CDATA[mouseClicked]]></methodname><![CDATA[(]]><methodname><![CDATA[MouseEvent]]></methodname><![CDATA[ ]]><methodname><![CDATA[e]]></methodname><![CDATA[) { }]]>
<![CDATA[        ]]>
<![CDATA[        ]]><token><![CDATA[public]]></token><![CDATA[ ]]><token><![CDATA[static]]></token><![CDATA[ ]]><token><![CDATA[void]]></token><![CDATA[ ]]><methodname><![CDATA[main]]></methodname><![CDATA[(]]><methodname><![CDATA[String]]></methodname><![CDATA[[] ]]><methodname><![CDATA[args]]></methodname><![CDATA[)]]>
<![CDATA[        {]]>
<![CDATA[                ...]]>
<![CDATA[        }]]>
<![CDATA[ }]]>
</programlisting></listitem></itemizedlist></section></section></article>