イベント処理

51
第6章
マウスで操作してみよう!!
¶
重要
• GUI(Graphical User Interface)
³
– java.awt パッケージ,javax.swing パッケージ
– コンポーネント (component)
∗ GUI の機能を実現
∗ レイアウト機能だけ ... コンテナ (container)
• イベント処理
– リスナ (listener) ... MouseListener, ActionLister インタフェース
インタフェースの統べてのメソッドを記述する必要あり.
– アダプタ (adapter) ... MouseAdapter, ActionAdapter クラス
µ
必要なメソッドだけ記述する.
6.1 GUI(Graphics User Interface とイベント)
java.awt というパッケージ名にも使われている AWT は,Abstract Window Toolkit の略であり,グラフィックス
描画やボタンなどのユーザインタフェースを様々なプラットホーム上で構築するための枠組である.
java.awt には,今まで利用してきた Graphics, Color などのグラフィックスの表示に関するクラスやイベント処理に
関するクラス,ユーザインタフェースを構築するためのクラスなどが用意されている.
ここでは java.awt パッケージを中心に,人間とコンピュータの間をグラフィックを使い,マウスの操作やキーボー
ドからの文字入力などで直観的かつ簡単に操作できる GUI の作成や GUI を実現するために行われるイベント処理に
ついて簡単に説明する.
java.awt では GUI の機能を実現するためにコンポーネント (component) と呼ばれるウインドウのオブジェクトを
提供している.コンポーネントには,GUI の機能を持つボタンやテキスト入力ウインドウや他のコンポーネントのオ
ブジェクトをレイアウトするための機能を提供するだけで GUI の機能は持ち合わせていないコンテナ (Container) が
ある.コンポーネントやコンテナを含む java.awt で用意されているクラスを表表 6.1 に示す.
しかし,AWT はユーザインタフェースとして機能が乏しく,プラットホームによってデザインや操作性が異なって
しまうなどの制限があった.そこで Netscape 社と Sun Microsystems 社の協力によってプラットホームに依存しない
操作性やデザインを提供する豊富なコンポーネントを持つライブラリである Swing が提供されるようになった.
GUI の機能を実現するためのコンポーネントとしては,javax.swing.JButton や javax.swing.JTextField などがあ
る.一方,他のコンポーネントのオブジェクトを配置するための機能を提供するコンテナとしては,javax.swing.JPanel
´
第 6 章 マウスで操作してみよう!!
52
表 6.1
働きによる分類
java.awt のクラス例
クラス名
基本図形のクラス
Point, Dimention, Rectangle, Polygon
グラフィックスの表示
色、フォント、イメージ
Graphics, Color, SystemColor, Font, FontMetrics, Im-
に関連したクラス
など
age, MediaTracker
Graphics2D の 描 画 に
Graphics2D, AlphaCommposite, BasicStroke, Gradient-
関連するクラス
Paint, TexturePaint, StandardGlyphSet, GraphicsConfiguaration, GraphicsEnvironment, GraphicsDevice
イベント処理に関連したクラス
AWTEvent, AWTEventMulticaster
Component と そ の サ
Component, Button, Label, Checkbox, Choice, List,
ブクラス
Canvas, TextComponent, TextField, TextArea, Scrollbar, Container, Panel, ScrollPane, Window, Frame
ユーザーインターフェ
レイアウトに関するク
CheckboxGroup, Insets, FlowLayout, BorderLayout,
イスを構築する部品
ラス
CardLayout, GridLayout, GridBagLayout, GridBagConstraints
その他、メニューやカー
Menu, MenuItem, CheckboxMenuItem, PopupMenu,
ソルなど
MenuShortcut, MenuBar, Cursor, Dialog, FileDiaglog,
PrintJob, AWTPermission, Toolkit
や javax.swing.JFrame などがある.これらを組み合わせることによって GUI を作成することができる.また,複数の
コンポーネントを部品として複雑な機能を持つコンポーネントもある.詳しくは,Java の API 仕様を参照すること.
GUI では,マウス操作やキーボードからの文字入力という形でユーザがアプリケーションに対してなんらかの操
作を行う.このとき,アプリケーションは,ユーザからの入力をイベント (event) という概念で取り扱う.イベント
は,アプリケーションが実行中,どのタイミングで,どんなイベントがユーザから与えられるか予め予測することは
できないため,アプリケーションは常にユーザからのイベントを監視する必要がある.このため java では,発生す
るイベントを監視するために独立したスレッドが立上り,イベントを受け取るとそのイベントに対応した処理を実行
する仕組みが用意されている.Java では,コンポーネントはイベントを検出する機能に特化し,イベント処理は別
のクラスのオブジェクトに行わせる代理人 (delegation) モデルが採用されている.これを実現するために新しい概念
としてリスナ (listener) とアダプタ (adapter) が導入されている.イベントの処理には,EventListener の拡張である
MouseListener, ActionLister などのインタフェースを実装することで実現することができる.また,アダプタはリス
ナのメソッドが実装済みのクラスであり,アダプタクラスを拡張することでも実現可能である.
6.2 マウスが押されたかされたか調べてみよう!!
例題 6.2.1 例題 5.1.1 のアニメーションをマウスボタンが押されている間停止するようにせよ.
2
マウスがクリックされたり,マウスボタンが押される,離されるというマウスイベントが発生したときに,何かの処
理をしたいという場合,次のように,マウスイベントを受け取るために,指定された MouseListener を追加する.
addMouseListener(MouseListener l)
6.2 マウスが押されたかされたか調べてみよう!!
53
プログラム 6.2.1 例題 6.2.1 のプログラム (MouseEvent1.java)
import javax.swing.JApplet;
import javax.swing.Timer;
import java.awt.Graphics;
import java.awt.Dimension;
import java.awt.event.*;
5
public class MouseEvent1 extends JApplet {
Dimension d;
int x, vx;
Timer timer;
10
public void init(){
d = getSize();
x = 0; vx = 1;
15
timer = new Timer(20, new ActionListener(){
public void actionPerformed(ActionEvent e){
if (x < d.width) x += vx;
else x = 0;
20
repaint();
});
}
addMouseListener(new MouseAdapter(){
25
public void mouseReleased(MouseEvent e){
timer.restart();
}
public void mousePressed(MouseEvent e){
timer.stop();
30
}
});
timer.start();
}
35
public void paint(Graphics g){
g.clearRect(0, 0, d.width, d.height);
g.drawArc(x, 10, 10, 10, 0, 360);
}
}
40
2
MouseListener インタフェースには,表 6.2 に示す 5 個のメソッドが用意されている.インターフェースの実装に
は,表 6.2 に示した 5 個のメソッド全てを記述する必要が,MouseAdapter クラスを利用した場合には,必要なマウス
イベントの処理だけを記述すれば良い.リスナの実装に比べると,アダプタを利用することによって必要のない記述
をしなくても良く,簡潔にプログラムを書くことができる.プログラム 6.2.1 の 25 行目では,addMouseListener メ
ソッドで MouseAdaptor を追加している.この例題では,マウスボタンが押された時と離された時に,アニメーショ
ンを停止,再開するので mousePressed メソッドと mouseReleased メソッドに対して処理を記述すれば良い.
第 6 章 マウスで操作してみよう!!
54
表 6.2 MouseListener インタフェースのメソッド
メソッド
概要
mouseClicked
マウスをクリックすると呼び出される
mouseEntered
マウスが入ると呼び出される
mouseExited
マウスが出ると呼び出される
mousePressed
マウスボタンが押されると呼び出される
mouseRelieased
マウスボタンが離されると呼び出される
6.3 マウスが動いたか調べてみよう!!
例題 6.3.1 マウスを動かすと例題 6.2.1 のボールのスピードが変化するプログラムを作成せよ.
2
マウスがクリックされたり,マウスボタンが押される,離されるというマウスイベントが発生したときに,何かの処理
をしたいという場合,次のように,マウスモーションイベントを受け取るために,指定された MouseMotionListener
を追加する.
addMouseMotionListener(MouseMotionListener l)
MouseMotionListener インタフェースには,表 6.3 に示す 2 個のメソッドが用意されている.
プログラム 6.3.1 の 25 行目では,addMouseMotionListener メソッドで MouseMotionAdaptor を追加している.
この例題では,マウスが動いた時に,ボールの速度を変化させるので mouseMoved メソッドに対して処理を記述すれば
良い.
表 6.3
MouseMotionListener インタフェースのメソッド
メソッド
概要
mouseDragged
マウスボタンを押してドラッグすると呼び出される
mouseMoved
マウスボタンを押さずに動かすとと呼び出される
6.4 マウスがクリックされたか調べてみよう!!
55
プログラム 6.3.1 例題 6.3.1 のプログラム (MouseEvent2.java)
import javax.swing.JApplet;
import javax.swing.Timer;
import java.awt.Graphics;
import java.awt.Dimension;
import java.awt.event.*;
5
public class MouseEvent2 extends JApplet {
Dimension d;
int x, vx;
Timer timer;
10
public void init(){
d = getSize();
x = 0; vx = 1;
15
timer = new Timer(20, new ActionListener(){
public void actionPerformed(ActionEvent e){
if (x < d.width) x += vx;
else x = 0;
20
repaint();
});
}
addMouseMotionListener(new MouseMotionAdapter(){
25
public void mouseMoved(MouseEvent e){
vx = (vx + 1) % 10;
});
}
timer.start();
30
}
public void paint(Graphics g){
g.clearRect(0, 0, d.width, d.height);
g.drawArc(x, 10, 10, 10, 0, 360);
}
35
}
2
6.4 マウスがクリックされたか調べてみよう!!
例題 6.4.1 マウスをクリックした位置に円を書くプログラムを作成せよ.
2
マウスがクリックされたマウスイベントを受け取るためには,プログラム 6.4.1 の例と同様に,MouseListener イ
ンタフェースを追加し,アダプタを利用して mouseClicked メソッドを記述すれば良い.また,マウスイベントが発
生した時のマウスポインタの位置を取得するには,MouseEvent クラスの getX メソッド,getY メソッドを用いる.
第 6 章 マウスで操作してみよう!!
56
プログラム 6.4.1 例題 6.4.1 のプログラム (MouseEvent3.java)
import javax.swing.JApplet;
import java.awt.Graphics;
import java.awt.Dimension;
import java.awt.event.*;
5
public class MouseEvent3 extends JApplet {
Dimension d;
int x, y, w = 10;
public void init(){
10
d = getSize();
x = d.width / 2; y = d.height / 2;
addMouseListener(new MouseAdapter(){
public void mouseClicked(MouseEvent e){
x = e.getX();
15
y = e.getY();
repaint();
}
});
}
20
public void paint(Graphics g){
g.clearRect(0, 0, d.width, d.height);
}
}
25
g.drawArc(x − w / 2, y − w / 2, w, w, 0, 360);
2
6.5 マウスでプログラムを操作してみよう!!
例題 6.5.1 描画領域を 300×400 画素とし,マウスの x 座標の位置に合わせて,y = 390 の位置に 40×10
の大きさの黒塗り矩形 (パッド) を描画するプログラムを作成せよ.
2
例題 6.5.2 描画領域を 300×400 画素とし,マウスをクリックすると 1 ≤ vy ≤ 5 の範囲のスピードで,
y = 0,任意の x 座標から鉛直下方に等速直線運動するプログラムを作成せよ.
2
例題 6.5.3 例題 6.5.1 と例題 6.5.2 を合わせて,マウスのクリックでボールが落下し,パッドでそのボール
を反射させるプログラムを作成せよ.また,天井での反射も考慮すること.
2
例題 6.5.4 例題 6.5.3 のプログラムを改良し,ボールの初速度を vy > 0,任意の vx,両側面での反射も
考慮するように変更せよ.
2
例題 6.5.5 マウスホイールを動かすと黒塗りのボールが赤くなるプログラムを作成せよ.
2
6.6 練習問題
57
プログラム 6.5.1 例題 6.5.5 のプログラム (MouseEvent8.java)
import javax.swing.JApplet;
import java.awt.Graphics;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.*;
5
public class MouseEvent8 extends JApplet {
Dimension d;
int red = 0;
10
public void init(){
d = getSize();
addMouseWheelListener(new MouseWheelListener(){
public void mouseWheelMoved(MouseWheelEvent e){
red =(red + 10)% 256;
15
repaint();
}
});
}
20
public void paint(Graphics g){
g.clearRect(0, 0, d.width, d.height);
g.setColor(new Color(red, 0, 0));
g.fillArc(10, 10, 10, 10, 0, 360);
}
25
}
2
6.6 練習問題
問題 6.1 マウスボタンが押されている間,位置 (10, 10) に赤の塗りつぶした直径 10 の円を描画するプログラムを作成
せよ.
問題 6.2 矩形の左上の位置を (0, 0) とし,マウスの x 座標にあわせて,矩形の横幅が変化するプログラムを作成せよ.
問題 6.3 マウスを 2 度にクリックすることによって線を描画するプログラムを作成せよ.1 度目 (奇数回目) にクリッ
クした点を始点,2 度目 (偶数回目) にクリックした点を終点とするようにプログラムを作成すれば良い.
問題 6.4 マウスを 2 度にクリックすることによって線を描画するプログラムを作成せよ.ただし,2 回目の位置を決
定するまでの間,マウスの位置に合わせて線を描画しつづけていること.
問題 6.5 マウスボタンが押されている間,マウスの位置に青の塗りつぶした直径 10 の円を描画しつづけるプログラム
を作成せよ.円を筆跡として自由な曲線が描画できるプログラムである.