第13回独習Javaゼミ

第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)


public void addTypeListener(TypeListener el)
throws TooManyListenersException


特定タイプのイベントリスナ(el)を複数登録
特定タイプのイベントリスナ(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に含まれる主なイベントクラス
イベント
ActionEvent
生成される条件
ボタンを押した時、リスト項目をダブルクリックした時、メニュー
項目を選択した時
AdjustmentEvent
スクロールバーを操作した時
ComponentEvent
コンポーネントが隠れた、移動した、サイズ変更された、表示
可能になった時
ContainerEvent
コンポーネントがコンテナに追加した、またはコンテナから削除
した時
FocusEvent
コンポーネントがキーボードフォーカスを取得した、または失っ
た時
InputEvent
マウスイベントまたはキーイベントが発生した時
主なイベントクラス(2)

java.awt.eventに含まれる主なイベントクラス(続き)
イベント
生成される条件
ItemEvent
チェックボックスまたはリスト項目をクリックした時、チョイスで選択を
行った時、チェック可能メニュー項目を選択または選択解除した時
KeyEvent
キーボードから入力を受け取った時
MouseEvent
TextEvent
マウスをドラックまたは移動した時、クリックした時、押した時、話した
時、その他、マウスをコンポーネントに入れた、またはコンポーネント
から出した時
テキストエリアまたはテキストフィールドの値を変更した時
WindowEvent ウィンドウを活動化した時、閉じた時、非活動化した時、アイコン化解
除した時、開いた時、終了した時
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型定数
定数
説明
MOUSE_CLICKED
マウスをクリックした
MOUSE_DRAGGED
マウスをドラッグした
MOUSE_ENTERED
マウスがコンポーネントに入った
MOUSE_EXITED
マウスがコンポーネントから出た
MOUSE_MOVED
マウスを移動した
MOUSE_PRESSED
マウスを押した
MOUSE_RELEASED
マウスを放した
MOUSE_WHEEL
マウスのホイールを回した
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イベントクラスに対応するリスナインターフェイス
イベントクラス
リスナインターフェイス
ActionEvent
ActionListener
AdjustmentEvent
AdjustmentListener
CompornentEvent
CompornentListener
ContainerEvent
FocusEvent
ContainerListener
FocusListener
ItemEvent
ItemListener
KeyEvent
KeyListener
MouseEvent
MouseWheelEvent
TextEvent
WindowEvent
MouseListener,MouseMotionListener
MouseWheelListener
TextListener
WindowListener
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.
プログラム例(1)を参考にキーボードから入力
されたキーを表示するプログラムを作成せよ。
利用するリスナインターフェイスはKeyListener
実装すべきメソッドは
void keyPressed(KeyEvent ke)
void keyReleased(KeyEvent ke)
public void keyTyped(KeyEvent ke)
の3つであるが、KeyPressedメソッドのみ使う
だけで良いとする(文字列を返すtoString()も用
いること)。
演習問題
2.
プログラム例(2)を参考に、線を引く機能を
持った、簡単な絵描きプログラムを作成せよ。
(ヒント:repaint()メソッドが呼ばれると、背景色
で一度上塗りされた後にpaint()メソッドが呼ば
れる。これをせずにpaint()メソッドへ移行させる
必要があるため、update()メソッドをオーバーラ
イドする必要がある)