Rhino詳細:JavaScriptからJavaインターフェースの実装とクラスの継承

白石俊平(あゆた)
2008-02-12 08:30:00
  • このエントリーをはてなブックマークに追加

方法その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件)
#1 さくらば   2008-02-19 23:37:43
最後のサンプルは Java SE 6 の Rhino では動作しません。Java SE 6 の JavaAdapter は Sun の実装に変更されており、単一インタフェースのみインプリメントすることができます。
#2 大野晋一   2008-02-21 15:08:21
さくらばさん、ご指摘ありがとうございます。おっしゃるとおり、Java SE 6とともに配布されるものでは無理で、最新のRhinoを使う必要がありますね。
  • 新着記事
  • 特集
  • ブログ
このサイトでは、利用状況の把握や広告配信などのために、Cookieなどを使用してアクセスデータを取得・利用しています。 これ以降ページを遷移した場合、Cookieなどの設定や使用に同意したことになります。
Cookieなどの設定や使用の詳細、オプトアウトについては詳細をご覧ください。
[ 閉じる ]