Draggable Applet
awk4j
(AWK for Java Platform)
Draggable Applet は、 アップレットをブラウザからデスクトップ上にドロップ可能とする技術で、
Java SE6 update10 からサポートされた
次世代 Java™ Plug-In テクノロジ (Java Plug-in) により実現される。
ホスト Java言語のクラス継承・インタフェース実装をサポートした
awk4j により、マルチリンガル環境での新しいスクリプティングの世界を体験ください。
複数言語連携 (AWK, Java) でマンデルブロ集合を表示。
デスクトップ上にドロップされたアップレットは
デスクトップアプリケーションとしてブラウザと非同期で動作する。
また、 このアップレットは jnlp (Java Network
Launching Protocol)
に対応しているためオフラインで起動可能。
- 左ボタン+ドラッグ: 拡大
- 右ボタン+ドラッグ: 縮小
- シフト+クリック: 中心座標移動
- Alt + Left click + Drag : デスクトップアプリケーション化
- オフライン起動: コントーロールパネル / Java /
インターネット一時ファイル / 表示
« サンプル: 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>
スクリプトで 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 ...
スクリプで 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 の場合は、 特別なスクリプト記述は不要 (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
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 など)
を考慮して上記の生成順となっている。
- JDK
6u10
- Release Notes for the Next-Generation Java™ Plug-In Technology