Go to Previous Page Go to Contents Go to Java Page Go to Next Page
New Features of Java2 SDK, Standard Edition, v1.4
 
 

MouseWheel

 
 

グリグリしましょ

 
 

Microsoft が IntelliMouse を発売してから、あっというまにマウスのホイールが一般化してしまいました。

一度触ったが最後、私もあのグリグリがやめられなくなってしまいました。たまに、ホイールのないマウスを使うと、ホイールがないのにグリグリしてしまって、結構いらいらしてしまったりします。

また、ホイールに対応していないアプリケーションがあったりするとやっぱりいらつくんですよね。そういう経験ないですか?

ところが、ホイールに対応していないアプリケーションがあったのです。そう、Java で作ったアプリケーションです。

でも、やっとそんな不幸な日々も解消されるのです。v1.4 で、ホイールは正式対応されました (^^)/

ためしに、次のアプレットを実行してみてください。ホイールが動作するのが確認できると思います。

Applet の HTML MouseWheelTest1.html
Applet のソース MouseWheelTest1.java

MouseWheelTest1 のソースはいたって簡単。単に JTable を生成しているだけです。

import javax.swing.*;
 
public class MouseWheelTest1 extends JApplet {
    public void init(){
        getContentPane().add(new JScrollPane(new JTable(50, 20)));
    }
}

ということは、特になにもしなくてもマウスのホイールが使えるということになります。

ためしに、J2SE, v1.3 の時のアプリケーションをJ2SE, v1.4 で実行してみてください。JTable や JTree は何も変更しなくてもホイールが使えるようになっていると思います。

これでおしまい...

というわけにはいかないので、実際にアプリケーションの中でホイールを扱う方法を次章で説明しましょう。

 

 
 

ホイールをプログラム中で扱うには

 
 

ホイールをプログラム中で扱うために、v1.4 では新たに java.awt.event.MouseWheelEvent クラスが導入されました。MouseWheelEvent クラスは MouseEvent クラスの派生クラスで、ホイールの回転量などを知ることができます。

イベントが追加されましたので、同時にリスナも追加されています。java.awt.event.MouseWheelListener クラスがリスナになります。MouseWheelListener はホイールが動かされたときにコールされる mouseWheelMoved メソッドを定義してあるインタフェースになります。

また、MouseWheelListener インタフェースはメソッドが 1 つしかありませんので、アダプタークラスは用意されていません。

それでは、MouseWheelEvent クラスを実際に使ってみましょう。

Applet の HTML MouseWheelTest2.html
Applet のソース MouseWheelTest2.java

このアプレット上でホイールを動かすと、MouseWheelEvent の詳細が表示されます。

 1: import java.awt.event.*;
 2: import javax.swing.*;
 3:
 4: public class MouseWheelTest2 extends JApplet {
 5:
 6:    private JTextArea area;
 7: 
 8:    public void init(){
 9:        area = new JTextArea();
10: 
11:        area.addMouseWheelListener(new MouseWheelListener(){
12:            public void mouseWheelMoved(MouseWheelEvent e){
13:                area.append(e.toString() + "\n");
14:            }
15:        });
16: 
17:        getContentPane().add(new JScrollPane(area));
18:    }
19:}

プログラムは特に難しいところはないと思います。

JTextArea を生成し、リスナー登録を行います。MouseWheelListener インタフェースを登録するには、addMouseWheelListener メソッドを使用します。

リスナーの実装は 11 行目から 15 行目で行っています。mouseWheelMoved メソッドでは area にイベントを表示させているだけです。

最後に area を JScrollPane に貼りつけて、それをアプレットに add しています。

表示されるのは、MouseWheelEvent の情報だけでなく、スーパークラスの MouseEvent、またそのスーパークラスの AWTEvent の情報も表示されるので、ちょっと分かりづらいかもしれませんが、次のような情報を得ることができます。

スクロールの種類 カーソルキーに相当するスクロールか、PageUp/Down キーに相当するスクロールかを示す。
回転量 ホイールをどの程度まわしたかを示す。スクロールの方向にはかかわらない。
スクロールの方向 ホイールを上に向けてまわしたか、下かを示す。

ここで表示される情報は、それぞれ MouseWheelEvent クラスの getScrollType メソッド、getScrollAmount メソッド、getWheelRotation メソッドで得ることができます。 

getScrollType メソッドの戻り値は MouseWheelEvent.WHEEL_UNIT_SCROLL か MouseWheelEvent.WHEEL_BLOCK_SCROLL になります。前者がカーソルキー、後者が PageUp/Down キーに相当します。

getWheelRotation メソッドの戻り値は int で、負の値であれば上方向、正であれば下方向を表します。

getScrollAmount メソッドはスクロールの方向を考慮しないのですが、方向を考慮したメソッドもあります。それが getUnitsToScroll メソッドです。このメソッドは上に回せば、スクロール量が負の値になります。

 

 
 

おまけ

 
 

せっかくホイールが使えるので、スクロールバーを動かすだけでなく、他のこともしてみたくなりませんか。

まわすことでなにかを表せないかなぁと思ってつくったのが、次のゲームです。

Hyper Olympic (ふ、ふるい...) ではボタンを交互に押すことでランナーが走りますが、このゲームではホイールをまわすことでスイマーが泳ぎます。そんなにちゃんと作ってはいないので、ほんとにおまけ程度のゲームだと思ってください (かなり、いいわけが入ってますが...)

Applet の HTML SwimDash.html
Applet のソース

SwimDash.java, SwimingPool.java

まぁ、ホイールはこんな使い方もできるぐらいに考えてください。

今回使ったサンプルはここからダウンロードできます。

(補) SDK がベータの時にはコンポーネントによって MouseWheelEvent を扱えないと前の版で記述しましたが、FCS では使えるようになったようです。このため、この部分に関する以前の記述は削除しました。(Apr. 2002)

参考 URL

(Jun. 2001)

 
 
Go to Previous Page Go to Contents Go to Java Page Go to Next Page