使用Eclipse编写Processing程序的一些注意事项
最近要做一个使用processing的数据分析作业,安装好processing之后发现原生的编译器不够好用,于是有了把它放在Eclipse里写的念头。上网找了几篇教程后发现示例代码无法正确运行,而且都是比较早的文章,所以又去翻了一阵找到了processing关于这部分内容的官方文档看了看,问题顺利解决。不得不说,官方文档永远是最规范完整的解释。现把官方文档的链接和个人的简化翻译版本贴上来,以方便有同样需要的朋友。
ps:更准确的说,这篇官方文档主要是给从Processing中转到Eclipse的人的指南,但至少我们仍能从这篇文档初步了解二者间的不同。
官方文档:
以下是个人对这篇文档的解释:
创建能在Eclipse内正确运行的程序(以下图片来源于官网)
第一步,在Eclipse中创建一个java项目
如图所示,创建了一个名为UsingProcessing的类,其中创建主方法是一定要选的,不选的话之后也要添加上去,在后面的一步操作中很关键。
我们有了这样的代码:
public class UsingProcessing {
public static void main(String[] args) {
// TODO Auto-generated method stub
}
}
现在要导入Processing的core
点击
File > Import > General > File System
点next
在上面那个Browse中选择
processing-3.5.3中的core中的Library文件夹,点确定
选中右侧的core.jar
再点下面的Browse,选中当前java 项目,点Finish,结果大概是这样:
现在还需要一些工作:选中core.jar,右键,选Build Path 中的Add to Build Path
结果:
现在我们已经成功将core.jar导入到当前项目中(注意:之后每次创建新项目时也都要这么操作一番才可以)
启动主类(原文里叫 Client Class,即客户端类)
一个Processing窗体是java中的一种PApplet的程序,它也是一个java类,所以我们需要有一个类来成为PApplet(也就是继承PApple,此时是上文的UsingProcessing类)。注意:我们需要import语句导入这个包,操作和导入一般的包一样。
import processing.core.*;
下面有一条特别需要注意的点:如果之前没有选创建main方法,则要创建一个
public static void main(String args[])
{
}
若已创建,则请忽略这一步。
有了main方法后,要在方法体里添加一句:
PApplet.main("UsingProcessing");
上面这句是类在default package里面的写法(引号内是类名)
自建包中的写法是:
PApplet.main("packageName.ClassName");
(注意:packageName是你创建的包的名字,ClassName就是类名啦)
ps:很久之前的processing版本不添加上面那句似乎也可以,至少在我查到的前几年博客中没有。
在main方法后添加三个方法:settings(), setup(), and draw()
setup()和draw()的用法和在processing原生编译器中的相同,唯一的不同是:我们需要把设定窗体大小的方法size()在settings()中调用,settings()中能写的方法也只有size(),且settings()要写在前两个之前。
在setup()中设置被画对象的颜色,draw()中设置被画的对象,如下例:
import processing.core.PApplet;
public class UsingProcessing extends PApplet{
public static void main(String[] args) {
PApplet.main("UsingProcessing");
}
public void settings(){
size(300,300);
}
public void setup(){
fill(120,50,240);
}
public void draw(){
ellipse(width/2,height/2,second(),second());
}
}
如果run时有选项,要选择 run as java application,不能选run as applet,否则无法正常运行
简短版本
1:创建一个java 项目
2:导入core.jar,并add to build path
3:创建一个新的类,继承PApplet,加上import语句
4:在main()方法内添加PApplet.main(“YourClassName”);
5:在main()方法后添加public void settings(), public void setup(), 和public void draw()这三个方法
6:在setting()中调用size(),并在setup()和draw()中添加内容
用面向对象的方式编写processing程序
以下这个例子是面向对象的,包含一个名为“stripe”的非主类。注意:在Processing中,所有的类都被当作PApplet的内部类,因此我们在继承了PApplet的类中可以直接调用PApplet的变量(如width 和 height)与方法(如rect() )
首先我们搭一个名为MyProcessingSketch的主类的框架
import processing.core.*;
public class MyProcessingSketch extends PApplet {
// An array of stripes
Stripe[] stripes = new Stripe[50];
public static void main(String[] args){
PApplet.main("MyProcessingSketch");
}
public void settings(){
size(200,200);
}
public void setup() {
// Initialize all "stripes"
for (int i = 0; i < stripes.length; i++) {
stripes[i] = new Stripe();
}
}
public void draw() {
background(100);
// Move and display all "stripes"
for (int i = 0; i < stripes.length; i++) {
stripes[i].move();
stripes[i].display();
}
}
}
第二步,创建一个叫Stripe的类。
在写入代码时,你会发现有许多错误
我们可以发现,错误都出现在调用PApplet的变量和方法中,这是因为现在的这个类与上例不同,不是PApplet的内部类,但Stripe不是PApplet,不能继承PApplet。
此时我们需要在Stripe类内创建一个PApplet的实例,通过这个实例来访问
public class Stripe {
PApplet parent; // The parent PApplet that we will render ourselves onto
// Draw stripe
void display() {
parent.fill(255,100);
parent.noStroke();
parent.rect(x,0,w,parent.height);
}
在构造方法中,我们要初始化这个parent实例
Stripe(PApplet p) {
parent = p;
整个代码如下
import processing.core.PApplet;
public class Stripe {
float x; // horizontal location of stripe
float speed; // speed of stripe
float w; // width of stripe
boolean mouse; // state of stripe (mouse is over or not?)
PApplet parent; // The parent PApplet that we will render ourselves onto
Stripe(PApplet p) {
parent = p;
x = 0; // All stripes start at 0
speed = parent.random(1); // All stripes have a random positive speed
w = parent.random(10,30);
mouse = false;
}
// Draw stripe
void display() {
parent.fill(255,100);
parent.noStroke();
parent.rect(x,0,w,parent.height);
}
// Move stripe
void move() {
x += speed;
if (x > parent.width+20) x = -20;
}
}
最后还要把主类中调用的Stripe类构造方法修改,在括号内加上this,表示当前的PApplet实例是主类外部继承的这个
stripes[i] = new Stripe(this);
此外,java没有color数据类型,因此原来定义颜色的类型color应改成int
color pink = color(255,200,200);//原来的写法
int pink = color(255,200,200);//现在的写法(在主类中)
int pink = parent.color(255,200,200);//在非主类中的写法
通用的一些函数
Processing中的很多函数在Eclipse也都有,但语法上有些不同
如鼠标事件函数,包括 mouseClicked(), mousePressed(), mouseDragged(), 和 mouseWheel().
这些方法写在setup()和draw()中时和原来一样,只不过声明时要加上public修饰符
void mousePressed() {
if (value == 0) {
...
}//processing中写法
public void mousePressed() {
if (value == 0) {
...
}//java(Eclipse)中写法
以上过程适用于鼠标,键盘以及所有的事件驱动函数
导出项目
导出项目的方法和一般的java项目相同,详情参考:
How to export a runnable .jar in Eclipse