トップ » 技術記事 » Java Applet でマクロ音楽シーケンサーを作る(3) - Java と JavaScript を連携する

Java Applet でマクロ音楽シーケンサーを作る(3) - 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サクラとソースコードはこちら

Java と JavaScript を連携することで、いろいろなことが実現できるようになります。
今回のように、文字列マクロのパースやコンパイルなど、処理速度が求められる場合は、
Java を利用する事で、JavaScriptでは難しい処理を行うことができます。

ぜひ、Java と JavaScript を連携させて面白いツールを作ってみてください。

Series Navigation

このサイトについて

八角研究所
株式会社八角研究所のWEBサイトですよー。 いろんなものを創り出すことのできる環境をコツコツ構築中。 いったい、いつになったらできるのか。 この技術情報サイトもそのための活動の一環のつもり。

執筆者紹介

クジラ飛行机

クジラ飛行机

くじらはんど(http://kujirahand/)にて、日本語プログラミング言語「なでしこ」(IPA未踏ユース採択)、テキスト音楽「サクラ」(OSPオンラインソフト大賞入賞)など多くのオンラインソフトを開発。著書に「Flexプロフェッショナルガイド」「なでしこ公式バイブル」、「一週間でマスターするActionScript3.0」など。

TrackBack URL :