• 検索結果がありません。

アプレットⅣ

N/A
N/A
Protected

Academic year: 2021

シェア "アプレットⅣ"

Copied!
9
0
0

読み込み中.... (全文を見る)

全文

(1)

アプレットⅣ

JV④ □ アプレット(イベント処理、イベントリスナ) □ アプレット(イベントリスナクラスの作成) □ アプレット(イベントリスナの登録) □ アプレット(イベント発生時の処理) □ アプレット(イベントの各種実装方法) □ アプレット(イベントアダプタ) □ アプレット(委譲モデル) 今回の課題項目 □ アプレット(イベントリスナ) □ アプレット(イベントアダプタ) 今回の重点項目

(2)

■ イベント処理 ■ 画面操作に依るイベント発生時の処理の仕方は、JDK 1.0 から JDK 1.1 に移行する際に、大幅に変更さ れた。従来のイベント処理方法は、JDK 1.1 以降でもサポートされて居るが、非推奨とされて居るので 此処では、新しいイベント処理方法に付いて説明する。 イベント処理の手順は、下記の通りで有る。 1.イベントリスナクラスを作成する。 2.イベントが発生するコンポーネント(オブジェクト)にイベントリスナを登録する。 3.イベントリスナ内のメソッドをオーバーライドして、イベント発生時の処理を記述する。 ■ イベントリスナクラス(Event Listener Class)の作成

イベントリスナ(Event Listener)はイベントの受信を行う為に使用するインタフェースで有り、イベ ント機能の必須部品で有る。イベントリスナはjava.util.EventListener のサブクラスで有り、イベント 名+Listner の名称を持つ。下記に、java.awt.event パッケージのリスナインターフェイスを示す。 リスナインターフェースの種類(AWT) ActionListener アクションイベントを受け取る為のリスナインタフェイス AdjustmentListener 調整イベントを受け取る為のリスナインタフェイス

AWTEventListener Component や MenuComponent、又は、其等のサブクラスのインスタンスで 有るオブジェクトにディスパッチされるイベントの通知を受信する為のリスナ インタフェイス ComponentListener コンポーネントイベントを受け取る為のリスナインタフェイス MouseListener コンポーネント上の関連するマウスイベント(プレス、リリース、クリック、 コンポーネントへの出入り)を受け取る為のリスナインタフェイス KeyListener キーボードイベント(キーストローク)を受け取る為のインタフェイス WindowListener ウィンドウイベントを受け取る為のリスナインタフェイス イベントリスナクラスとは、イベントリスナを実装(Implement)したクラスの事で有る。イベントリ スナクラスを定義する書式は、下記の通りで有る。

class クラス名 extends 親クラス implements インターフェイス名[,インターフェイス名…] インターフェイスを実装するには、implements 節でインターフェイス名を指定する。カンマで区切り 複数のインターフェイスを指定する事も出来る。

上記の様に、インターフェイスを実装する事に依り、インターフェイスで定義されたメソッドを、必ず 実装したクラスで実装しなければ成らなく成る。即ち、メソッドの内容を定義する必要が有る。

例えば、ActionListener インターフェイスは、actionPerformed メソッドが定義されて居る丈なので、此のメ ソッド丈を実装すれば良いが、MouseListener インターフェイスでは、mouseClicked メソッド、mouseEntered メソッド、mouseExited メソッド、mousePressed メソッド、mouseReleased メソッドと5個のメソッドが 定義されて居り、此等の総てのメソッドを定義する必要が有る。

猶、extends 節では、継承(Inheritance)する親クラスを指定する。

(3)

■ イベントリスナを登録 イベントを発生する事の出来るオブジェクトをイベントソース(Event Source)と呼ぶ。イベントソー スには、其のコンポーネントがサポートするイベントのイベントリスナ型のオブジェクトを引数に取る イベントリスナ登録用メソッドが用意されて居る。 コンポーネントにリスナクラスに登録する書式は、下記の通りで有る。 イベントソース名.Add~Listener(イベントリスナ型オブジェクト); 具体的には、アプレット上のボタンにActionListener イベントリスナを登録して関連付けるには、下記 の様に、記述する。

java.awt.Button bn = new java.awt.Button("終了"); bn.addActionListener(this); 猶、関連付けには、リスナクラス自体を関連付けるのではなく、リスナクラスのインスタンスを関連付 ける。 ■ イベント発生時の処理 イベントの受信は、イベントを送信するオブジェクトに登録されたイベントリスナに依り行う。作成し たイベントリスナ用のインターフェースには、イベントが起きた時に呼ばれるメソッドが宣言されて居 るので、オーバーライドして実装する。 下記に、ActionListener インターフェイスを実装するクラスを java.awt.Button クラスのオブジェクト に登録する具体例を示す。 import java.applet.*; import java.awt.*; import java.awt.event.*; // ActionListener インターフェースを実装するクラス

public class ButtonEvent extends Applet implements ActionListener {

Button bn; // Button クラスの変数の宣言 public void init( )

{

bn = new Button("終了"); // Button クラスのオブジェクトを生成 bn.addActionListener( this ); // イベントリスナを登録

this.add( bn ); // アプレットにボタンを登録 }

// ActionListener で宣言されて居るイベント時に呼び出されるメソッドを実装 public void actionPerformed(ActionEvent e)

{ bn.setLabel("諒解"); } } bn オブジェクトでは、内部的に ActionListener 型の変数を保持して居り、イベントが発生した時に其 の変数がnull を指して居なければ(リスナクラスのオブジェクトが登録されて居れば)其の変数が指す オブジェクトのactionPerformed メソッドを呼び出す。

(4)

■ イベントの実装方法 イベントを実装するイベントハンドラの記述法には、前項のコンテナがイベントリスナを実装する方法 以外にも、下記の方法が有る。 ・イベントリスナを実装したクラスを作る ・イベントリスナを内部クラスにする ・イベントリスナを無名内部クラスにする 孰れの記述法も、一長一短が有る為、作成するプログラムに応じて、使い分ける事が望ましいが、此処 では、イベントを実装する際に良く用いられる、イベントリスナを無名内部クラスにする例を、下記に 示す。 import java.applet.*; import java.awt.*; import java.awt.event.*; // ActionListener インターフェースを実装するクラス public class ButtonEvent2 extends Applet

{

public void init( ) {

// java.awt.Button クラスの変数の宣言とオブジェクトを生成 final Button bn = new Button( "終了" );

// イベントリスナを登録

bn.addActionListener( new ActionListener( ) {

// ActionListener で宣言されて居るイベント時に呼び出されるメソッドを実装 public void actionPerformed( ActionEvent e )

{ bn.setLabel( "諒解" ); } }); // アプレットにボタンを登録 this.add( bn ); } } 抽象クラスは、其の儘ではインスタンス化する事は出来ないが、上記の様に、全メソッドの実装を記述 したブロックを付加して置けば、其れが可能と成る。詰まり、生成と実装を同時に記述する事が出来る 訳で有る。 猶、クラス宣言が無いが、此れもクラスで有り、クラス名が無い為、無名(又は、匿名)内部クラスと 謂う。因みに、class ファイル名は、外部クラス名に$1 等のドルマークと番号の付いた名前が、自動的 に付けられる。

(5)

■ イベントアダプタ ■ イベントアダプタはイベント機能の必須の部品では無いが、プログラミング上の便宜を図る為に、習得 して置き度いオブジェクトで有る。 イベントリスナはインタフェースの為、此れを実装(Implement)したクラスでは、総てのメソッドを オーバライドしなければ成らず、プログラミングが煩雑と成る。 イベントアダプタは、此の欠点を解消する為に用意されるヘルパークラスで、イベントアダプタを継承 したクラスでは、必要なメソッド而巳をオーバライドすれば良く成る。此の為、イベントアダプタはメ ソッドが2個以上有るイベントリスナの場合で無いと意味を持た無い。 Java ではマルチプルインヘリタンス(多重継承)を使用する事が出来ない為、イベントアダプタを使 用する事が出来ない場合も有るが、役に立つ事の方が圧倒的に多いのでイベントの設計の時には、用意 して置く事が推奨される。 前記のActionListener インターフェースは、其の中で定義されて居るメソッドは1個丈で有るが、イベ ントリスナ用のインターフェースの中には、複数のメソッドを定義して居る物も有る。例えば java.awt.event.WindowListener インターフェースは、ウィンドウが開かれた、閉じられる、閉じられ た等、下記の7種のイベント発生時に呼ばれるメソッドを定義して居る。

public void windowOpened( WindowEvent e ); public void windowClosing( WindowEvent e ); public void windowClosed( WindowEvent e ); public void windowIconified( WindowEvent e ); public void windowDeiconified( WindowEvent e ); public void windowActivated( WindowEvent e ); public void windowDeactivated( WindowEvent e );

此の内、ウインドウが閉じられたイベント丈を検知して処理を行い度い場合でも、WindowListener イ ンターフェースを実装したクラスを作成するには、インターフェースで宣言されたメソッド総てを実装 しなくては、コンパイル時にエラーが発生する。其の為、使用しないメソッド迄も実装すると謂う面倒 な記述を行はなくては成らない。 其の手間を省く為に、複数のメソッドを持つイベントリスナ用のインターフェースには、アダプタクラ スが用意されて居る。此れは、例えばWindowListener インターフェースに対しては、WindowAdapter クラスとして、下記の様に、総てのメソッドを空の処理で実装した物で有る。

public void windowOpened( WindowEvent e ) { } public void windowClosing( WindowEvent e ) { } public void windowClosed( WindowEvent e ) { } public void windowIconified( WindowEvent e ) { } public void windowDeiconified( WindowEvent e ) { } public void windowActivated( WindowEvent e ) { } public void windowDeactivated( WindowEvent e ) { }

イベントリスナクラスを作成する場合は、此の様なアダプタクラスを継承して、目的のメソッド而巳を オーバーライドして実装すれば良い事に成る。

(6)

■ 主なアダプタクラス

下記に、主なアダプタクラスを示す。

イベントクラス リスナインタフェイス リスナメソッド アダプタクラス ActionEvent ActionListener actionPerformed 無し

AdjustmentEvent AjustmentListener ajustmentValueChanged 無し ComponentEvent ComponentListener componentMoved

componentResized componentShown componentHidden

ComponentAdapter

ContainerEvent ContainerListener componentAdded componentRemoved

ContainerAdapter FocusEvent FocusListener focusGained

focusLost

FocusAdapter InputMethodEvent InputMethodListener carePositionChanged

inputMethodTextChanged 無し ItemEvent ItemListener itemStateChanged 無し KeyEvent KeyListener keyPressed

keyReleased keyTyped

KeyAdapter

MouseEvent MouseListener mouseClicked mouseEntered mouseExited mousePressed mouseReleased MouseAdapter MouseMotionListener mouseDragged mouseMoved MouseMotionAdapter MouseInputListener 上記7メソッド全部 無し

WindowEvent WindowListener windowActivated windowClosed windowClosing windowDeactivated windowDeiconfied windowIconfied windowOpened WindowAdapter ■ 委譲モデル(Delegation Model) リスナーやアダプターを利用してイベント処理を行う事を委譲モデルと謂う。イベント発生源(イベン トソース)其の物では無く、イベント処理の役割を持つオブジェクトに処理を行わせるモデルで有る。

イベント処理方法には、他に、Windows の MFC(Microsoft Foundation Class)等でも使われて居る コンポーネント(イベントソース)自身にイベント発生時に呼び出されるメソッドが有り、此れをオー バーライドする事でイベントのハンドリングを行うと謂うモデルが有るが、委譲モデルは、其れとは異 なり、イベントソースで有るコンポーネントに対して、イベントを通知して欲しいオブジェクト(イベ ントリスナ-)を登録する事で、イベントが其のオブジェクトに委譲(delegate)される手法で有る。

(7)

■ イベントソースの判定 ■ 下記のコードを、テキストエディタで入力し、SourceJudge.java と謂うファイル名で保存した後、コン パイルして、HTML ファイルから呼び出し、ブラウザで表示する。 import java.applet.*; import java.awt.*; import java.awt.event.*; // ActionListener インターフェースを実装するクラス

public class SourceJudge extends Applet implements ActionListener {

Button bn1, bn2; // java.awt.Button クラスの変数の宣言 Label lbl; // java.awt.Label クラスの変数の宣言 public void init( )

{

lbl = new Label( "" ); // java.awt.Label クラスのオブジェクトを生成 bn1 = new Button( "表示" ); // java.awt.Button クラスのオブジェクトを生成 bn2 = new Button( "消去" );

bn1.addActionListener( this ); // イベントリスナを登録 bn2.addActionListener( this );

setLayout( new BorderLayout( ) ); // レイアウトの設定 this.add( lbl, BorderLayout.NORTH );

this.add( bn1, BorderLayout.CENTER ); this.add( bn2, BorderLayout.SOUTH ); }

// ActionListener で宣言されて居るイベント時に呼び出されるメソッドを実装 public void actionPerformed( ActionEvent e )

{ if( e.getSource( ) == bn1 ) // イベントソースの判定 { lbl.setText( "烏賊の王様" ); // ラベルに文字列を設定 } else { lbl.setText( "" ); // ラベルにヌルストリングを設定 } } } ▼ getSource( ):イベントが最初に発生したオブジェクトを返すメソッド(Method) java.awt.event.ActionEvent クラスが、java.util.EventObject クラスから継承したメソッドで有る。 ▼ setText( ):キャプションを指定したテキストに設定するメソッド(Method)

(8)

■ マウスイベント処理 ■ 下記のコードを、テキストエディタで入力し、DrawLine.java と謂うファイル名で保存した後、コンパ イルして、HTML ファイルから呼び出し、ブラウザで表示する。 import java.applet.*; import java.awt.*; import java.awt.event.*;

public class DrawLine extends Applet {

int x, y; // マウスの x 座標と y 座標格納用の変数の宣言 Graphics g; // Graphics オブジェクトの宣言

Button b; // Button オブジェクトの宣言

public void init( ) {

g = getGraphics( ); // グラフィックス・オブジェクトの取得

// マウスのボタンが押された時の位置( x, y )を取得する。(今回は線の開始点の座標) addMouseListener( new MouseAdapter( )

{

public void mousePressed( MouseEvent e ) { // マウスプレス位置を x と y に設定 x = e.getX( ); y = e.getY( ); } }); // マウスでドラックした時の位置( x, y )を取得し、随時、其の分、線を引く addMouseMotionListener( new MouseMotionAdapter( )

{

public void mouseDragged( MouseEvent e ) {

// ( x, y ) と現在のマウス位置との間に直線を描画 g.drawLine( x, y, e.getX( ), e.getY( ) );

// x, y の更新。 x = e.getX( ); y = e.getY( ); } }); // Button オブジェクトのインスタンス作成 b = new Button( "クリア" ); // ボタンクリック時にクリア

b.addActionListener( new ActionListener( ) {

public void actionPerformed( ActionEvent e ) {

repaint( ); }

});

setLayout( new BorderLayout( ) ); // ボーダーレイアウトを設定

add( b, "South" ); // ボーダーレイアウトの南へボタンを配置 }

(9)

■ マウスイベント処理 ■ 下記のコードを、テキストエディタで入力し、MouseImage.java と謂うファイル名で保存した後、コン パイルして、HTML ファイルから呼び出し、ブラウザで表示する。 import java.applet.*; import java.awt.*; import java.awt.event.*;

public class MouseImage extends Applet implements MouseListener {

Image img[ ] = new Image[ 5 ]; int Xmax, Ymax;

int nImage = 20;

int x = 10, y = 10, p = 1;

public void init( ) {

addMouseListener( this ); for ( int i = 0; i < 5; i++ )

img[i] = getImage( getDocumentBase( ), "pic0" + ( i+1 ) + ".gif" ); setBackground( Color.blue );

Xmax = getSize( ).width; Ymax = getSize( ).height; }

public void mouseClicked( MouseEvent e ){ } public void mouseEntered( MouseEvent e ){ } public void mouseExited( MouseEvent e ){ } public void mouseReleased( MouseEvent e ){ } public void mousePressed( MouseEvent e ) { x = e.getX( ); y = e.getY( ); repaint( ); }

public void paint( Graphics g ) {

p = ( int ) Math.floor( Math.random( ) * 5 ); g.drawImage( img[p], x, y, this );

} }

※ 此のプログラムを作動させるには、pic01~pic05.gif と謂うファイル名の 5 枚の画像ファイルが必要 で有る。任意の画像に差し替えても良い。

参照

関連したドキュメント

実際, クラス C の多様体については, ここでは 詳細には述べないが, 代数 reduction をはじめ類似のいくつかの方法を 組み合わせてその構造を組織的に研究することができる

事業セグメントごとの資本コスト(WACC)を算定するためには、BS を作成後、まず株

本装置は OS のブート方法として、Secure Boot をサポートしています。 Secure Boot とは、UEFI Boot

・関  関 関税法以 税法以 税法以 税法以 税法以外の関 外の関 外の関 外の関 外の関係法令 係法令 係法令 係法令 係法令に係る に係る に係る に係る 係る許可 許可・ 許可・

機器表に以下の追加必要事項を記載している。 ・性能値(機器効率) ・試験方法等に関する規格 ・型番 ・製造者名

電子式の検知機を用い て、配管等から漏れるフ ロンを検知する方法。検 知機の精度によるが、他

海水の取水方法・希釈後の ALPS 処理水の放水方法 取水方法 施工方法.

るものとし︑出版法三一条および新聞紙法四五条は被告人にこの法律上の推定をくつがえすための反證を許すもので