MY-NOTEBOOK

Friday, December 19, 2008

Processing + Java で Hello World(ハローワールド)...Javaアプリケーションにプロセッシングのスケッチを埋め込む方法

Processing は、通常 PDE と呼ばれる統合開発環境でスケッチしながら使います。
スケッチの成果物は、アプレットとして書き出して単体配布できます。
これは、これで便利な機能ですが、Javaプログラマであれば、
直接JavaにProcessingを埋め込んで使った方が早い場合があります。
Eclipse上で開発すれば、コード補完も効きますからPDEを使わなくても、
スケッチもはかどります。

TOC

お約束のHello World

ということで、Javaに埋め込む方法を整理しました。
といっても基本は、processing.core.PApplet を継承して、
スケッチコード(setup,draw メソッド)を追加するだけです。

MyPApplet.java

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をのせているフレームが...

  • リサイズされたとき
  • バックグラウンドに移動してからフォアグラウンドに再び戻ったとき

などに描画内容が失われます。

そこで、以下のように必要なタイミングで redraw() を
呼ぶように、TestFrame.javaを実装します。

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()のあたりがポイントです。

コンパイルと実行に必要なjar

Processingの ダウンロードページ からWindows[Without Java] のリンクをクリックして、 processing-1.0.1-expert.zip を入手します。

以下の2つの jar をカレントディレクトリにコピーして...

  • processing-1.0.1-expert/lib/core.jar
  • processing-1.0.1-expert/lib/ecj.jar

カレントディレクトリと core.jar,ecj.jarにパスを通してコンパイル,実行します。

$ javac -classpath .:core.jar:ecj.jar *java
$ java -cp .:core.jar:ecj.jar TestFrame

※Java Runtime Environment 1.6 でテスト

© 2006-2012 Tomoaki Oshima