Post date: Apr 20, 2013 9:47:52 AM
processingで2つのウインドウを扱うには、いくつか方法がある。今回は3つの方法をあげる。
□□□1□□□
例えば、javaのawtのFrameを継承するとか。その場合、Frameで作ったウインドウの中では、多分、Processingの命令は使えない。
一応サンプル。
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
PrefFrame frm;
Test test;
void setup() {
size(640, 480);
frm = new PrefFrame("2ウインドウ テスト");
frm.setLocation(200, 200);
frm.setSize(250, 350);
frm.setBackground(Color.LIGHT_GRAY);
frm.setVisible(true);
test=new Test();
test.init();
}
void draw() {
background(255);
}
class Test extends PApplet {
void setup() {
size(400, 400);
}
void draw() {
}
}
class PrefFrame extends Frame {
public PrefFrame(String title) {
//フレームのタイトル
setTitle(title);
fill(0);
rect(100, 100, 100, 100);
//ウィンドウを閉じる時
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
}
);
}
}
□□□2□□□
また、2画面出すライブラリを作ろうと頑張ってる人もいるらしい。
http://processing.org/discourse/beta/num_1272033841.html
上のリンクの「ExtraWindowExample」のリンクでサンプルソースがGetできる。
□□□3□□□
もう一つの方法に、netライブラリを使って2つ以上のProcessingのプログラムをプロセス間通信でつなげて擬似的に1つのプログラムとして扱っちゃう方法もある。
滅茶苦茶強引な上に、もちろんprocessingの命令で相手のプログラムを操作することもできない。
2つのエディタに次のプログラムを売って欲しい。
server.pde
import processing.net.*;
Server myServer;
int val = 0;
color c;
void setup() {
size(640, 480);
// Starts a myServer on port 5204
myServer = new Server(this, 5204);
c=color(0);
noStroke();
}
void draw() {
Client thisClient = myServer.available();
if (thisClient != null) {
net(thisClient);
}
if (mousePressed) {
fill(c);
ellipse(mouseX, mouseY, 10, 10);
}
}
void net(Client client) {
String dataIn = client.readString();
String cstr[]=split(dataIn, " ");
if (cstr.length!=3)return;
c=color(parseInt(cstr[0]), parseInt(cstr[1]), parseInt(cstr[2]));
println("set color");
}
client.pde
import processing.net.*;
Client myClient;
int dataIn;
void setup() {
size(255, 255);
// Connect to the local machine at port 5204.
// This example will not run if you haven't
// previously started a server on this port.
myClient = new Client(this, "127.0.0.1", 5204);
for (int i=0;i<256;i++) {
stroke(0, 0, i);
line(0, i, 255, i);
}
}
void draw() {
if (mousePressed) {
String str=""+0+" "+0+" "+mouseY;
myClient.write(str);
}
}
さて、上のプログラムは簡単なペイントツールである。
clientの画面で色(青だけ)を選んで、serverの画面で絵がかける。
ここで重要なのはserverから先に起動しないといけないということである。代わりにclientは、serverが起動していれば何度でも再起動できる。
あと、いまはclient側で「 myClient = new Client(this, "127.0.0.1", 5204); 」とipアドレスに127.0.0.1を選んでいる(ローカルループバックアドレスというらしい)ので同じパソコン上で2つのプログラムを通信させているが、ここをつないでるネットワークのipアドレスにすることで、LAN内のパソコン間で通信が簡単にできる。