You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java中Processing的setFill方法失效问题求助

解决PShape setFill失效的问题

嘿,我来帮你搞定这个矩形颜色无法更新的问题!你的代码里有几个关键问题导致setFill不起作用,我来一步步拆解并修复:

问题分析

  1. setup函数语法错误:你的setup少了括号,应该写成void setup()
  2. PShape创建方式错误:在d.beginShape()内部调用rect()是无效的——rect()是直接绘制到画布的函数,不会被PShape捕获。你需要用vertex()来手动定义矩形的四个顶点,这样PShape才能正确存储形状数据。
  3. disableStyle的影响:你调用了d.disableStyle(),这会让PShape忽略自身的填充、描边样式,转而使用当前绘图上下文的样式(也就是draw()里设置的样式),所以你调用setFill自然不会生效。
  4. 鼠标事件处理不当:在draw()里判断鼠标位置不如直接用mousePressed()函数更直观,专门处理点击事件。

修复后的完整代码

PShape d;

void setup() {
  size(600, 600);
  // 正确创建PShape矩形:用vertex定义顶点
  d = createShape();
  d.beginShape();
  // 初始填充色
  d.fill(100);
  // 定义矩形四个顶点(x,y对应左上角、右上角、右下角、左下角)
  d.vertex(0, 0);
  d.vertex(200, 0);
  d.vertex(200, 200);
  d.vertex(0, 200);
  d.endShape(CLOSE);
  // 不要调用disableStyle,保留PShape自身的样式控制权
}

void draw() {
  background(255);
  // 绘制PShape,参数是形状对象+偏移位置
  shape(d, 300, 250);
}

void mousePressed() {
  // 判断点击是否在矩形范围内(要考虑shape的偏移量300,250)
  if (mouseX >= 300 && mouseX <= 300+200 && mouseY >=250 && mouseY <=250+200) {
    // 随机生成新的填充色,也可以用固定色
    d.setFill(color(random(255), random(255), random(255)));
    // 如果你之前不小心调用了disableStyle,需要重新启用才能让setFill生效:
    // d.enableStyle();
  }
}

关键说明

  • PShape的顶点定义:因为我们在绘制shape时添加了偏移(300,250),所以创建PShape时把矩形的顶点设为从(0,0)开始的局部坐标,这样更灵活。
  • 样式控制:保留PShape的样式启用状态(默认就是启用的,不用额外调用enableStyle),这样setFill的修改才会被应用到形状上。
  • 点击范围判断:要把shape的偏移位置算进去,因为shape(d,300,250)是把PShape的局部坐标(0,0)映射到画布的(300,250)位置,所以矩形的实际范围是300-500 x 250-450。

这样修改后,每次点击矩形区域,它就会自动切换颜色,而且不需要重新绘制整个形状,完全符合你的需求!

内容的提问来源于stack exchange,提问作者helen v

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:58:59