Processingは、通常 PDE と呼ばれる統合開発環境でスケッチしながら使います。 スケッチの成果物は、アプレットとして書き出して単体配布できます。これは、これで便利な機能ですが、Javaプログラマであれば、直接JavaにProcessingを埋め込んで使った方が早い場合があります。 Eclipse上で開発すれば、コード補完も効きますからPDEを使わなくても、スケッチもはかどります。
ということで、Javaに埋め込む方法を整理しました。 といっても基本は、processing.core.PApplet を継承して、 スケッチコード(setup,draw メソッド)を追加するだけです。
import processing.core.PApplet;
class MyPApplet extends PApplet{
private int width=300;
private int height=250;
public void setup(){
size(width,height);
textFont( createFont("Default", 9) );
smooth();
noLoop();
}
public void draw(){
background(255,255,255);
fill(0);
textSize(24);
textAlign(CENTER,CENTER);
float x=width/2f;
float y=height/2f;
text("Hello, World!",x,y);
}
}
動きのないスケッチの場合は、setup()メソッドで、noLoop() を呼んでおきます。 ただし、これだと一度だけしか draw() メソッドが呼び出されないので、 MyPAppletをのせているフレームが (1) リサイズされたとき (2) バックグラウンドに移動してからフォアグラウンドに再び戻ったとき などに描画内容が失われます。
そこで、以下のように必要なタイミングで redraw() を呼ぶように、TestFrame.javaを実装します。
import java.awt.BorderLayout;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.JFrame;
public class TestFrame extends JFrame{
private MyPApplet a;
public TestFrame(){
super();
addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
addComponentListener(new ComponentAdapter(){
public void componentShown(ComponentEvent e) {
if(a!=null)
a.redraw();
}
public void componentResized(ComponentEvent e) {
if(a!=null)
a.redraw();
}
});
doMyLayout();
}
private void doMyLayout(){
a=new MyPApplet();
a.init();
setLayout(new BorderLayout());
add(a,BorderLayout.CENTER);
}
public static void main(String[] args) {
try{
JFrame f=new TestFrame();
f.pack();
f.setLocation(100,100);
f.setVisible(true);
}
catch(Exception ex){
ex.printStackTrace();
}
}
}
※addComponentListener()のあたりがポイントです。
Processingのダウンロードページ からWindows[Without Java] のリンクをクリックして、 processing-1.0.1-expert.zip を入手します。
processing-1.0.1-expert/lib/core.jar ,processing-1.0.1-expert/lib/ecj.jar の2つの jar をカレントディレクトリにコピーして を カレントディレクトリと core.jar,ecj.jarにパスを通してコンパイル,実行します。
$ javac -classpath .:core.jar:ecj.jar *java
$ java -cp .:core.jar:ecj.jar TestFrame
※Java Runtime Environment 1.6 でテスト