Rhino詳細:JavaScriptからJavaインターフェースの実装とクラスの継承
方法その3:JavaAdapterの利用
さてこれまで紹介してきた方法では、通常のJavaクラスにおいては可能な、以下のような事柄を実現できません。
- 複数のインターフェースを実装
- クラスの継承
例えば、GUIアプリケーションのマウスイベントを一括して処理するためのクラスを作成することを考えましょう。そのために、java.awt.eventパッケージ内のMouseListenerとMouseMotionListener(マウスのドラッグや移動に関するイベントリスナ)をどちらも実装することにします。
さらに、MouseListenerインターフェースにはメソッドが5つもあって、その全てを実装するのは面倒なので、代わりにMouseAdapterクラス(MouseListenerに対する空の実装)を継承することにします。この場合、Javaでは以下のようなコードになることでしょう。
import java.awt.event.*;
public class MouseListenerImpl
extends MouseAdapter
implements MouseMotionListener {
...(略)...
}
こうしたコードをJavaScript内で実現するためには、Rhinoでは「JavaAdapter」と言う特殊なクラスを用いる必要があります。JavaAdapterのコンストラクタは次のような定義になっています。
JavaAdapter(
親クラスorインターフェース,
インターフェース...,
実装を表すJavaScriptオブジェクト)
クラスを継承する場合は、第一引数にJavaクラスを指定します。継承を行わない場合は、インターフェースを複数指定できます。最後の引数は、オーバーライドするメソッドを定義したJavaScriptオブジェクトです。これも文章だけではわかりにくいので、以下の例を見てください。
importPackage(java.awt.event);
// MouseAdapterを継承、MouseMotionListenerを実装したオブジェクトを作成
// クリック時とドラッグ時にのみメッセージを出力
var mouseListener = new JavaAdapter(MouseAdapter, MouseMotionListener, {
mouseClicked: function(event) {
print("マウスがクリックされました!");
},
mouseDragged: function(event) {
print("マウスがドラッグされました!");
},
mouseMoved: function(event) {
}
});
var win = new Packages.javax.swing.JFrame("Hello");
// リスナとして指定
win.addMouseListener(mouseListener);
win.addMouseMotionListener(mouseListener);
win.setSize(200, 200);
win.visible = true;
このスクリプトを実行すると、中身が何もないウィンドウが表示されます。そのウィンドウ上でクリックやドラッグを行うと、標準出力にメッセージが出力されます。コピー&ペーストで簡単に試せるのがスクリプト言語の良いところなので、このサンプルもぜひ動かしてみてください。
まとめ
今回は、Rhinoのスクリプト内でJavaインターフェースを実装/Javaクラスを継承する方法を学びました。ここまで学べば、Javaライブラリのほとんど全てをJavaScriptから利用できます。ぜひ、自由自在にJava APIを操ってみてください。
次回は、「JavaScriptからJavaを呼び出す」のではなく、「JavaからJavaScriptを呼び出す」ための方法について解説したいと思います。
- コメント(2件)
- ホワイトペーパー



