You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Processing 4 Beta 1中自定义按钮无法响应点击问题求助

修复Processing按钮点击无响应的问题

我仔细看了你的代码,发现几个导致按钮不响应点击的核心问题,咱们逐个解决:

问题1:点击状态从未被标记为true

你的Button类里,Clicked变量初始是false,但在update()方法中,当检测到鼠标在按钮区域内按下时,完全没有给Clicked赋值为true的逻辑——这就导致isClicked()永远返回false,自然不会触发后续的打印操作。

问题2:更新与检测的顺序颠倒

draw()函数里,你先调用login1.isClicked()判断点击,再调用login1.update()更新状态。这意味着你检测的是上一帧的旧状态,而不是当前帧刚更新的点击状态,逻辑顺序完全反了。

问题3:背景未持续重绘(非核心但影响体验)

loginPage()只在setup()里执行一次,draw()循环中没有重绘背景,虽然不影响点击功能,但按钮重复渲染会导致文本重叠,影响视觉效果。


修正后的完整代码

Button login1;
boolean clicked = false;

void setup() {
  fullScreen();
  // 直接在这里初始化按钮,避免空指针
  login1 = new Button(100,50,400,200,"Zaloguj sie",64, 136, 253,255,255,255);
}

void draw() {
  // 每帧都重绘登录页面背景和标题
  background(27, 50, 131);
  textSize(70);
  fill(255);
  text("System Statku Organizacji 587 'Aurora'", 600, 150);
  
  // 先更新按钮状态,再检测点击
  login1.update();
  login1.render();
  
  if (login1.isClicked()) {
    println("AAAA");
  }
}

class Button {
  boolean pressed = false; // 变量名用小驼峰更符合Java规范
  boolean clicked = false;
  PVector pos = new PVector(0,0);
  float width;
  float height;
  color colour;
  color textColour;
  String text;

  Button(int x, int y, float w, float h, String t, int r, int g, int b, int tr, int tg, int tb) {
    pos.x = x;
    pos.y = y;
    width = w;
    height = h;
    text = t;
    colour = color(r,g,b);
    textColour = color(tr,tg,tb);
  }

  void update() {
    // 每帧先重置点击状态
    clicked = false;
    
    if (mousePressed && mouseButton == LEFT && !pressed) {
      pressed = true;
      // 检测鼠标是否在按钮范围内,是则标记为点击状态
      if (mouseX >= pos.x && mouseX <= pos.x + width && mouseY >= pos.y && mouseY <= pos.y + height) {
        clicked = true;
      }
    } 
    // 鼠标松开时重置按压状态
    if (!mousePressed) {
      pressed = false;
    }
  }

  void render() {
    noStroke();
    fill(colour);
    rect(pos.x, pos.y, width, height);
    fill(textColour);
    textAlign(CENTER, CENTER);
    text(text, pos.x + (width/2), pos.y + (height/2));
  }

  boolean isClicked() {
    return clicked;
  }
}

关键修改说明

  1. 修复点击状态标记:在update()方法中,当检测到鼠标在按钮区域内按下时,将clicked设为true,让isClicked()能正确返回点击状态。
  2. 调整执行顺序draw()中先调用login1.update()更新状态,再检测isClicked(),确保使用的是当前帧的最新状态。
  3. 持续重绘背景:把背景和标题绘制移到draw()循环里,避免多次渲染导致的视觉残留问题。
  4. 规范变量命名:把类内的大写开头变量改成小驼峰(比如Pressedpressed),符合Java/Processing的命名规范,提升代码可读性。
  5. 提前初始化按钮:直接在setup()里创建按钮实例,避免潜在的空指针问题。

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

火山引擎 最新活动