330 likes | 404 Views
第 14 回独習 Java ゼミ. セクション1~3 発表者 直江 宗紀. GraphicalUserInterface(GUI). グラフィカルユーザーインターフェイスとは グラフィカルな表示等による視覚的操作が出来る 操作はマウス等のポインティングデバイスが中心 コマンドライン上の操作がメインの CUI(Character-based User Interface) とは違う GUI ベースのプログラム 「イベントドリブン」である必要性. イベントドリブン. イベントドリブンとは ユーザーが操作をした時にプログラム処理 何も無ければ待機状態
E N D
第14回独習Javaゼミ セクション1~3 発表者 直江 宗紀
GraphicalUserInterface(GUI) • グラフィカルユーザーインターフェイスとは • グラフィカルな表示等による視覚的操作が出来る • 操作はマウス等のポインティングデバイスが中心 • コマンドライン上の操作がメインのCUI(Character-based User Interface)とは違う • GUIベースのプログラム • 「イベントドリブン」である必要性
イベントドリブン • イベントドリブンとは • ユーザーが操作をした時にプログラム処理 • 何も無ければ待機状態 • リアルタイム状態(ポーリング)での欠点→CPU処理資源を著しく欠いてしまう • 単純な処理の流れ 待機 イベント通知待ち 処理・実行 イベント通知の間は何もしない
代行イベントモデル(1) • イベントドリブンインターフェイス • 定義する方法は数種類存在する • イベントモデルにより特定のメカニズムが決まる • 現在のJDKでは、代行イベントモデルが使われている • 代行イベントモデル • ユーザが操作した際にソースから、その操作を示すオブジェクトのイベントを生成し、イベントオブジェクトを一連のリスナ(イベント監視)に送信する標準メカニズムのこと
ソース • ソース • イベント(のオブジェクト)を生成する元(資源) • ソースの責任 • リスナが特定のタイプのイベントに関する通知を登録・登録解除できるようにするメソッドを提供すること • イベント(のオブジェクト)の生成 • 登録されたリスナ全てにイベントを送信すること(イベントは、単一のリスナに対するユニキャストでも、複数のリスナに対するマルチキャストでも構わない)
イベント • イベント • ソースにおける状態変更を表すオブジェクト • ソースの状態変更とは→ユーザがアプレットに行った操作全般のこと • イベントの生成タイミング→GUI内の要素に対して操作を行った時 • ボタンを押す • マウスをクリックする • ウィンドウを閉じたりする・・・等
リスナ • リスナ • イベント通知(イベントオブジェクトの送信)を受ける • リスナの責任 • 特定のイベントに関する通知を受け取ることを登録する • そのタイプのイベントを受け取るインターフェイスを実装すること(implementsにより受け取るイベントを作る) • 通知を受け取る必要が無くなった場合には登録を解除する
代行イベントモデル(2) • 代行イベントモデルのモデル図 リスナ イベント リスナ ソース リスナ
代行イベントモデル(3) • イベントに関する情報をカプセル化 • クラスjava.awt.event.ActionEvent→ソース、イベント、リスナを扱うためのメソッドが内包されている • オーバーライド無しでも明示的にやり取りが行われる • 次章において、詳細に扱う
ソース実装メソッド • addTypeListener()メソッド • public void addTypeListener(TypeListener el) • 特定タイプのイベントリスナ(el)を複数登録 • public void addTypeListener(TypeListener el) throws TooManyListenersException • 特定タイプのイベントリスナ(el)を一つ登録 • removeTypeListener()メソッド • public void removeTypeListener(TypeListener el) • 特定タイプのイベント通知の登録を解除
イベント登録及び受け取りメソッド • アクションイベント受け取りの登録または解除 • void addActionListener(ActionListener al) • void removeActionListener(ActionListener al) • al:リスナオブジェクトの参照 • リスナはjava.awt.event.ActionListenerインターフェースを実装しなければならない • アクションイベント受け取り • void actionPerformed(actionEvent ae) • ae:アクションイベントの参照
イベントクラス • 様々なGUI要素 • Abstract Window Toolkit(AWT)→ボタン、チェックボックス。スクロールバーなどの一連の標準コンポーネントを提供している • イベントクラス • 各種タイプのAWTイベントを表す一連のクラスが用意
イベントオブジェクト • EventObject • Objectを拡張したクラス • java.utilパッケージに含む • コンストラクタ • EventObject(Object src) • 主なメソッド • Object getSouce() • イベントを生成したオブジェクトを返す • Stng toString() • イベントの等価の文字列を返す
AWTイベントクラス • AWTEventクラス • 全てのAWTイベントクラスはこのクラスのサブクラス • java.awtパッケージに含まれる • コンストラクタ • AWTEvent(Object source,int id) • source:イベントを生成するオブジェクト • id:イベントのタイプ • メソッド • int getID() • イベントのタイプを返す • String toString()
ComponentEventクラス(1) • ComponentEventクラス • AWTEventクラスを拡張したクラスの一つ • 各種コンポーネントイベントのタイプの識別に使用するint型定数が定義される • コンストラクタ • ComponentEvent(Conponent src,int type) • src:イベントを生成したオブジェクトの参照 • type:イベントのタイプ • メソッド • Component getComponent() • srcを生成したコンポーネントを返す
ComponentEventクラス(2) • ComponentEventクラスの主な定数 • COMPONENT_HIDDEN • コンポーネントが隠れた • COMPONENT_MOVED • コンポーネントが移動した • COMPONENT_RESIZED • コンポーネントのサイズが変更された • COMPONENT_SHOWN • コンポーネントが表示可能になった
主なイベントクラス(1) • java.awt.eventに含まれる主なイベントクラス
主なイベントクラス(2) • java.awt.eventに含まれる主なイベントクラス(続き)
InputEventクラス • InputEventクラス • ComponentEventクラスのサブクラス • KeyEvent、MouseEventをサブクラスに持つ • Inputに関する情報を扱う場合に使用できるint型整数(修飾子)が定義されている • ALT_MASK,CTRL_MASK,等 • getModifiers()メソッド • int getModifiers() • イベントの修飾子フラグを全て含むint型の値を返す
MouseEventクラス(1) • MouseEventクラス • InputEventクラスのサブクラス • 主なコンストラクタ • MouseEvent(Component src,int type,long when,int modifiers,int x,int y,int clicks,boolean triggersPopup) • src:生成したコンポーネントの参照 • type:イベントタイプ • modifiers:イベント発生時にどの修飾子が押されたか • x,y:マウス座標 • clicks:クリック回数 • triggerPopup:ポップアップメニュー表示の可否
MouseEventクラス(2) • マウスイベントのタイプ識別のためのint型定数
MouseEventクラス(3) • 主なメソッド • int getX(),int getY() • イベント発生時のマウス座標を返す • Point getPoint() • java.awt.Pointクラスは座標のカプセル化をする • インスタンス変数としてx,yがある • void translatePoint(int x,int y) • イベントの場所の変更 • int getClickCount() • イベント発生時のマウスクリック回数を返す
イベントリスナ(1) • java.util.EventListenerインターフェイス • イベントクラスにより作られたイベントを処理する • それぞれのイベントクラスに対応したリスナインターフェイスがある • インターフェイスは全てjava.awt.eventパッケージで宣言されている
イベントリスナ(2) • AWTイベントクラスに対応するリスナインターフェイス
MouseListenerについて(1) • イベント通知の登録及び解除 • Componentクラスのメソッドを用いる • void addMouseListener(MouseListener ml) • void addMouseMotionListener(MouseMotionListener mml) • それぞれのイベント通知を登録(通知可にする) • void removeMouseListener(MouseListener ml) • void removeMouseMotionListener(MouseMotionListener mml) • それぞれのイベント通知登録を解除 • MouseMotion • ドラッグやポインタが動かされる時に起きるイベント
MouseListenerについて(2) • マウスイベントを受けるインターフェイスの実装 • MouseListenerインターフェイスの場合 • 実装するメソッド • void mouseClicked(MouseEvent me) • void mouseEntered(MouseEvent me) • void mouseExited(MouseEvent me) • void mousePressed(MouseEvent me) • void mouseReleased(MouseEvent me)
MouseListenerについて(3) • マウスイベントを受けるインターフェイスの実装(続き) • MouseMotionListenerインターフェイスの場合 • 実装するメソッド • void mouseDragged(MouseEvent me) • void mouseMoved(MouseEvent me)
使用例(1) • イベントリスナを利用した時のプログラム例(1) import java.applet.*; import java.awt.*; import java.awt.event.*; /* <applet code="test1" width="200" height="200"></applet> */ public class test1 extends Applet implements MouseListener{ public void init(){ addMouseListener(this) ; } public void mouseClicked(MouseEvent me){ setBackground(Color.BLUE) ; repaint() ; } (次ページに続く…)
使用例(2) • プログラム例(続き) public void mouseEntered(MouseEvent me){ setBackground(Color.GREEN) ; repaint() ; } public void mouseExited(MouseEvent me){ setBackground(Color.RED) ; repaint() ; } public void mousePressed(MouseEvent me){ setBackground(Color.white) ; repaint() ; } public void mouseReleased(MouseEvent me){ setBackground(Color.YELLOW) ; repaint() ; } }
使用例(3) • イベントリスナを利用した時のプログラム例(2) import java.applet.*; import java.awt.*; import java.awt.event.*; /* <applet code="test1" width="200" height="200"></applet> */ public class test1 extends Applet implements MouseListener,MouseMotionListener{ Point p ; public void init(){ addMouseListener(this) ; addMouseMotionListener(this) ; } public void mouseClicked(MouseEvent me){ } public void mouseEntered(MouseEvent me){ } public void mouseExited(MouseEvent me){ } 次ページ に続く…
使用例(4) • プログラム例(続き) public void mousePressed(MouseEvent me){ p=me.getPoint() ; repaint() ; } public void mouseReleased(MouseEvent me){ p=null ; repaint() ; } public void mouseDragged(MouseEvent me){ p=me.getPoint() ; repaint() ; } public void mouseMoved(MouseEvent me){ } public void paint(Graphics g){ if(p!=null){ int xc=getSize().width/2 ; int yc=getSize().height/2 ; g.drawLine(xc,yc,p.x,p.y) ; } } }
演習問題 • プログラム例(1)を参考にキーボードから入力されたキーを表示するプログラムを作成せよ。利用するリスナインターフェイスはKeyListener実装すべきメソッドはvoid keyPressed(KeyEvent ke)void keyReleased(KeyEvent ke)public void keyTyped(KeyEvent ke)の3つであるが、KeyPressedメソッドのみ使うだけで良いとする(文字列を返すtoString()も用いること)。
演習問題 • プログラム例(2)を参考に、線を引く機能を持った、簡単な絵描きプログラムを作成せよ。(ヒント:repaint()メソッドが呼ばれると、背景色で一度上塗りされた後にpaint()メソッドが呼ばれる。これをせずにpaint()メソッドへ移行させる必要があるため、update()メソッドをオーバーライドする必要がある)