Friday, December 19, 2008 / Processing, Java

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

hello-world

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

お約束の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をのせているフレームが (1) リサイズされたとき (2) バックグラウンドに移動してからフォアグラウンドに再び戻ったとき などに描画内容が失われます。

そこで、以下のように必要なタイミングで 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 を入手します。

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 でテスト