如何向Java Processing函数传递参数并调用自定义draw方法?
解决Java Processing中自定义带参数绘制方法的调用问题
问题根源
你用PApplet.main("Circle", ball)的方式完全错误——PApplet.main()的作用是启动继承自PApplet的子类,而你的Circle类并不是PApplet子类,Processing会默认创建一个100x100的空窗口,根本不会执行你想要的带参数绘制逻辑。
正确实现方案
方案1:在主PApplet类内定义自定义绘制方法
将带Ball参数的绘制逻辑写在你的Main类(继承PApplet的主类)里,在系统自动调用的无参draw()中调用它:
import processing.core.PApplet; public class Main extends PApplet { Ball gravityBall; public void settings() { size(800, 600); // 设置窗口大小 } public void setup() { gravityBall = new Ball(width/2, 50, 30); // 初始化小球 } // Processing自动调用的无参draw循环 public void draw() { background(255); // 应用重力逻辑 gravityBall.y += 0.8; // 调用自定义带参数的绘制方法 drawBall(gravityBall); } // 自定义带Ball参数的绘制方法 private void drawBall(Ball ball) { fill(255, 0, 0); ellipse(ball.x, ball.y, ball.size, ball.size); } public static void main(String[] args) { PApplet.main("Main", args); // 正确启动主PApplet类 } } // 自定义Ball类 class Ball { float x, y; int size; Ball(float x, float y, int size) { this.x = x; this.y = y; this.size = size; } }
方案2:在Circle类中封装绘制逻辑(需传入PApplet实例)
如果想把绘制逻辑放在Circle类里,要让它接收PApplet实例作为参数,通过这个实例调用Processing的绘图API:
// 自定义Circle类 class Circle { // 静态方法,接收PApplet实例和Ball对象 public static void drawBall(PApplet p, Ball ball) { p.fill(0, 0, 255); p.ellipse(ball.x, ball.y, ball.size, ball.size); } }
然后在Main类的draw()中调用:
public void draw() { background(255); gravityBall.y += 0.8; Circle.drawBall(this, gravityBall); // this就是当前PApplet实例 }
关键注意点
- 只有继承
PApplet的类才能通过PApplet.main()启动,它会触发settings()、setup()、draw()等生命周期函数。 - 自定义带参数的绘制方法无法被Processing自动调用,必须在系统的无参
draw()循环内部主动调用。 - 非PApplet子类不能用
PApplet.main()启动,否则会生成默认空窗口,且无法执行你的自定义逻辑。
内容的提问来源于stack exchange,提问作者ilovebender
相关产品推荐
相关产品推荐

