Draggable Applet

awk4j (AWK for Java Platform)

Draggable Applet とは

Draggable Applet は、 アップレットをブラウザからデスクトップ上にドロップ可能とする技術で、 Java SE6 update10 からサポートされた 次世代 Java™ Plug-In テクノロジ (Java Plug-in) により実現される。
ホスト Java言語のクラス継承・インタフェース実装をサポートした awk4j により、マルチリンガル環境での新しいスクリプティングの世界を体験ください。

さあ始めよう

Draggable Applet

複数言語連携 (AWK, Java) でマンデルブロ集合を表示。

デスクトップ上にドロップされたアップレットは デスクトップアプリケーションとしてブラウザと非同期で動作する。 また、 このアップレットは jnlp (Java Network Launching Protocol) に対応しているためオフラインで起動可能。

サンプル (マンデルブロ集合)

« サンプル: SimpleMandel1.awk »
#% import java.awt.Container;
#% import java.awt.event.MouseEvent;
#% import javax.swing.JFrame;
#% import mandel.MandelEngine;

BEGIN {               # コマンドライインから起動された場合.
  #%  JFrame frame = new JFrame("awk4j - Mandelbrot (Java)");
  #%  frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  #%  frame.setResizable(false);
  #%  frame.add((Container) getContent());
  #%  frame.pack(); frame.setVisible(true);

}
function palette() {
  #%  ((MandelEngine) engine).setPalette(HUE, SAT, GRA, ITE);
}
function calculate() {
  #%  ((Container) container).setVisible(false);
  #%  ((MandelEngine) engine).calculate(X, Y, W, ITE);
  #%  ((Container) container).setVisible(true);

}
function zoom(x, y, isShiftDown, button) {
  if (isShiftDown) {  # シフト+クリック:中心座標移動
    X = (X + (x - CIMG_WIDTH / 2) * W / CIMG_WIDTH)
    Y = (Y - (y - CIMG_HEIGHT / 2) * W / CIMG_WIDTH)
  } else {
    if (0 != button) mouseButton = button
    W = (1 == mouseButton) ? W / 1.5 : W * 1.5  # ドラッグ:拡大, 右ボタンドラッグ:縮小
  }
  calculate()
}
function getContent() {
  CONVFMT = "%.18g"; CIMG_WIDTH = 320; CIMG_HEIGHT = CIMG_WIDTH / 4 * 3
  X = -1.94155844996; Y = 0.00011276997004344; W = 0.0000001
  HUE = 0; SAT = .4; GRA = .01; ITE = 1024
  #%  java.awt.event.MouseAdapter adapter = new java.awt.event.MouseAdapter() {
  #%    public void mouseDragged(MouseEvent e) { zoom(e.getX(), e.getY(), e.isShiftDown(), e.getButton()); }
  #%    public void mousePressed(MouseEvent e) { mouseDragged(e); }
  #%  };
  engine;  #%  engine = new MandelEngine(CIMG_WIDTH, CIMG_HEIGHT);
  #%  Container imagex = new javax.swing.JLabel(new javax.swing.ImageIcon((MandelEngine) engine));
  #%  imagex.addMouseListener(adapter);
  #%  imagex.addMouseMotionListener(adapter);
  #%  Container panel = new javax.swing.JPanel();

  container;  #%  container = panel; panel.add(imagex);
  palette(); calculate()
  return container
}
#%  public void init() {  // アップレットから起動された場合.
#%    super.getContentPane().add((Container) getContent());
#%  }

Note: コマンドライインから起動された場合は BEGINアクション、 アップレットの場合、 init が呼び出される。

Note: JavaFX および Python のサンプルもアップレット対応している。

飛び出すアップレット

ドラッガブル・アップレット化するためには、 html の applet タグに draggable パラメータを設定する。

<applet ... ><param name="draggable" value="true" /></applet>

Java の場合

スクリプトで JApplet の init メソドをオーバライドして初期化をおこなう。

#% public void init() { ... }

トランスレータで JApplet クラスの継承を指定する。

${JAVA} org.awk4j.translator.Awk2Java -hostscript1 -extends "javax.swing.JApplet" source.awk >source.java

クラスファイルを 署名付き jar ファイル化する。

$(JAVA_HOME)/bin/jarsigner ...

Python の場合

スクリプで JApplet の init メソドをオーバライドして初期化をおこなう。

#% class SimpleMandel4(javax.swing.JApplet):
#%   def __init__(self): ...

Jython のコアライブラリを含めて jar ファイル化する。

$(JYTHON_HOME)/jythonc -i -C $(JAVA_HOME)/bin/javac -c -j ...

jar ファイルに署名する (sample/src/SimpleMandel4.awk, sample/makepy221 参照)。

$(JAVA_HOME)/bin/jarsigner ...

JavaFX の場合

JavaFX の場合は、 特別なスクリプト記述は不要 (GUIアプリは全てアプレットとして動作可能)。
JavaFX File Packager Utility を使用して、 署名付きアプレットの作成指示をおこなえば、 html と jar が自動生成される (sample/makefx applet, sample/applet/applet.html 参照)。

$(JAVAFX_HOME)/bin/javafxpackager -sign -draggable -cp bin;../awk4j.jar -d APPDIR -src SRCDIR -appClass $(TARGET) -appWidth 320 -appHeight 320

Translator

AWKスプリプトから Javaへの変換

${JAVA} org.awk4j.translator.Awk2Java -hostscript1 -extends "javax.swing.JApplet" source.awk >source.java

トランスレータ起動オプション

-hostscript
[0]|1  # HOST SCRIPT を有効化
-extends
[]  # 継承 Class Extends (Java)
-implements
[Runnable]  # 実装 Interface Implements (Java)
-package     
[]  # パッケージ名称 (Groovy, Java, JavaFX, JavaScript)
-xref
[1]|0  # クロスリファレンス出力
-srcname
[file name]  # ソースファイル名称
--source
[]  # コマンドラインよりスクリプトを直接指定
-d
[.]  # スクリプトコードの出力ディレクトリ
-include
[../lib/include]  # インクルードライブラリのディレクトリ

トランスレータが主力するスクリプトの構造

トランスレータ起動オプションの埋め込みとホスト言語の生成順序

package
#% HOST SCRIPT 先頭ブロック (include など)
 class srcname extends implements {
global変数定義 (クラス変数)
function ブロック
#% HOST SCRIPT 関数(メソド)ブロック
アクション ブロック
BEGIN ブロック
END ブロック
 }
xref (クロスリファレンス)

Note: 定義順序に意味を持つホスト言語 (Python など) を考慮して上記の生成順となっている。

関連リンク


Draggable Applet
  1. Draggable Applet とは
  2. さあ始めよう
    1. サンプル 1 (マンデルブロ集合)
  3. 飛び出すアップレット
    1. Java の場合
    2. Python の場合
    3. JavaFX の場合
  4. Translator
    1. トランスレータ起動オプション
    2. トランスレータが主力するスクリプトの構造
  5. 関連リンク