サイトマップ
-
Contents
-
Information
Java Applet でマクロ音楽シーケンサーを作る(3) - Java と JavaScript を連携する
- ウェブブラウザとMIDIについて
- Java の MIDI ライブラリ
- Java と JavaScript を連携する
Java と JavaScript を連携する~Java Applet でマクロ音楽シーケンサーを作る その3
今回は、主にJavaScriptからJava Appletを操作する方法について紹介します。前回、Javaでマクロ文字列から音楽を演奏する「JAVAサクラ」を作成しました。これを、JavaScriptから操作します。JavaScriptからJavaを操作する(またその逆を行う)ことで、JavaScriptだけでは実現の難しいプログラムも作ることができます。
JavaとJava AppletとJavaScript
はじめに、今回登場する技術について解説します。
今回扱うのは、「Java」と「Java Applet」、そして「JavaScript」です。これらはいずれも名前が似ていますので、混乱しないようにしましょう。
Javaは、Sun Microsystems社が開発したプログラミング言語です。
C言語などのプログラミング言語で作ったプログラムは、OSに依存した実行形式のバイナリにコンパイルされます。しかし、Javaでは、OSや実行環境に採用されないようマシン語ではなく中間コードに変換されます。そして、仮想マシン上で中間コードが実行されます。
そして、Java Applet は、JavaをWebブラウザ上で実行できるようにしたものです。
これに対して、JavaScript は、Sun Microsystems社とNetscape Communications社が開発したスクリプト言語です。Javaに表記方法を似せて作られたため、JavaScriptと名付けられました。Webブラウザに動的な要素を組み込むために使われます。
JavaScriptからJava Appletを操作する
JavaとJavaScriptは別の言語ですから、普通に考えると、これを連携させることはできません。
しかし、LiveConnectの機能を使う事で、JavaScriptからJava Appletの関数を呼び出したり、その逆で、JavaからJavaScriptが呼び出せるようになります。
今回利用するのは、Java で作ったマクロ音楽シーケンサーを、JavaScriptから操作するのに利用します。
Java側で必要な対応
Java側で必要なのは、JavaScriptから呼び出すための関数を定義しておくことです。以下は、JAVAサクラのJava Applet用のコードの抜粋です。compile関数で、音楽マクロを設定し、play関数で演奏を行い、stop関数で演奏を停止します。
package com.kujirahand.sakura; import java.awt.*; import java.applet.*; public class SakuraApplet extends Applet { public String compile(String mml) { //.. } public void play() { sakura.play(); } public void stop() { sakura.stop(); } }
コードを見ると分かると思いますが、特別な処理は必要ありません。
JavaScript側(HTML側)で必要な対応
まず、Java Applet を表示するためのコードを準備してみます。Java Applet を表示するためには、「applet」タグを記述します。ここでは、JAVAサクラのクラスファイルを、sakura.jar というJARファイルにまとめたものをロードして使うことにします。
<applet id="javasakura" height="32" width="500" codebase="./" code="com.kujirahand.sakura.SakuraApplet" archive="sakura.jar" mayscript> </applet>
ここでポイントになるのが、mayscript です。セキュリティ上の理由により、デフォルトでは、LiveConnect が利用できないようになっています。mayscript を指定することにより、利用できるようになります。
また、Java Applet を特定するために、id をつけておきます。ここでは、javasakura という id をつけています。Ajax のキーワードで人気の多くの Prototype.js などの JavaScript ライブラリでは、$(’IDの名前’) と書く事で、DOM オブジェクトを取得する事ができるようになっています。
今回は、こうしたライブラリを使いませんが、id を取得するのに便利なので、$(’ID’)でオブジェクトが取得できるように定義しておきます。
function $(id) { if (typeof(id) == "string") { return document.getElementById(id); } else { return id; } }
Applet のオブジェクトが取得できれば、あとは、このオブジェクトに対してメソッドの実行などを行う事で、Javaのオブジェクトを操作することができます。先ほど、JAVAサクラで定義した、playメソッドを呼び出すには、以下のように記述することができます。
var o_javasakura = $("javasakura"); if (o_javasakura && o_javasakura.play) { o_javasakura.play(); } else { alert("JavaApplet が読み込まれていません。"); }
変数「o_javasakura」に、javasakura のオブジェクトを取得します。何らかの原因で、Java Applet が読み込まれない場合を考慮して、o_javasakura のテストをしてから、メソッドを実行します。
Java Applet から JavaScript(HTML) を操作する場合
今度はその逆で Java Applet から JavaScript や HTML を操作する方法について見ていきます。
JavaScript 側は、上で見た通り、「applet」タグに mayscript を指定します。そして、Java から呼び出す関数を設定しておきます。ここでは、JAVAサクラでマクロ文字列を演奏する場合に、何かコマンドの指定エラーがあった時に、エラーメッセージを表示するメソッド「showError」を定義しておきます。
function showError(message) { // Java Applet から呼ばれる alert(message); }
次に、Java側では、JSObject を利用します。このために、パッケージ「netscape.javascript.*」を取り込んでおく必要があります。また、コンパイルのために、JDKに付属するライブラリをCLASSPATHに通す必要があります。
これは、Windowsでは以下のパスにあります。
JRE1.4.1以前 C:\\j2sdk1.4.1\\jre\\lib\\jaws.jar JRE1.4.2 C:\\j2sdk1.4.2\\jre\\lib\\plugin.jar JRE1.5.0 C:\\Program Files\\Java\\jre1.5.0\\lib\\plugin.jar
Mac OS X Tiger では、次のパスにありあます。
/System/Library/Frameworks/JavaVM.framework/Version/1.5.0/Home/lib/plugin.jar
以下のプログラムは、Java Applet が開始された時に、「アプレットが読み込まれました。」とメッセージを表示します。
package com.kujirahand.sakura; import java.awt.*; import java.applet.*; import netscape.javascript.*; public class SakuraApplet extends Applet { public void init() { // Call JavaScript Method String msg = "アプレットが読み込まれました。"; JSObject win = JSObject.getWindow(this); Object[] args = new Object[1]; args[0] = msg; win.call("showError", args); } //…
はじめに、JSObject の getWindow メソッドを呼びだし、JSObject のインスタンスを取得します。
次に、call メソッドを使って、JavaScript のメソッドを実行することができます。
このとき、第1引数がメソッドの名前、第2引数がメソッドに与える引数です。
JAVAサクラの完成とまとめ
JAVAサクラの本体も、前回より、細かい部分を調整したり、作り込んだりしました。
サクラには、スクリプトの機能がありますが、まだまだ、JAVAサクラは、そこまで作り込めていません。
しかし、Java Applet でマクロ音楽シーケンサー(MMLプレイヤ)を作るという試みはとりあえず果たせたと思っています。
Java と JavaScript を連携することで、いろいろなことが実現できるようになります。
今回のように、文字列マクロのパースやコンパイルなど、処理速度が求められる場合は、
Java を利用する事で、JavaScriptでは難しい処理を行うことができます。
ぜひ、Java と JavaScript を連携させて面白いツールを作ってみてください。
このサイトについて
TrackBack URL :
