【问题标题】:Implementation of the Erase Button擦除按钮的实现
【发布时间】:2021-05-15 15:14:03
【问题描述】:

我创建了“擦除”按钮。单击擦除按钮时应删除鼠标绘制的图形。它应该与绘图程序类似地工作。我使用了以下代码,它对擦除按钮的功能没有任何作用。所以,如果我在切换打开时画了一些东西,如果我点击“擦除”按钮,什么都不会发生。有人可以帮我解决这个问题。

import controlP5.*;

ControlP5 cp5;


boolean onOff = false;

boolean erase = false;

void setup(){
  size(1000, 1000);
  background(255);
  PFont font = createFont("Calibri", 15);
  
  
  cp5 = new ControlP5(this);
  
   cp5.addToggle("onOff").
  setPosition(150, 20).
  setSize(40, 15).
  setFont(font).
  
  setMode(ControlP5.SWITCH);
  
   cp5.addButton("Erase").
  setPosition(890, 20).
  setSize(100, 30).
  setFont(font);
  
}
  
  void draw(){
    
    
  fill(246, 246, 246);
  stroke(246, 246, 246);
  rect(0,0, 1000, 80);
  
  stroke(0);
 if (mousePressed == true && onOff == true) {
 line(mouseX, mouseY, pmouseX, pmouseY);
 }
 
}

 void keyPressed(){ 
   if(erase == true) {
     
     background(255);
   }
 }

【问题讨论】:

    标签: java processing keypress erase


    【解决方案1】:

    ControlP5 有一个很酷的功能,它可以自动将变量名称映射到 UI 元素。为了让 ControlP5 找到 UI 元素的名称需要与变量或函数匹配的对应关系。

    在您的情况下,只需更改

    cp5.addButton("Erase")
    

    cp5.addButton("erase")
    

    匹配boolean erase = false;

    这是您的代码更改了一个字母并自动格式化(Ctrl+T / CMD + T):

    import controlP5.*;
    
    ControlP5 cp5;
    
    
    boolean onOff = false;
    
    boolean erase = false;
    
    void setup() {
      size(1000, 1000);
      background(255);
      PFont font = createFont("Calibri", 15);
    
    
      cp5 = new ControlP5(this);
    
      cp5.addToggle("onOff").
        setPosition(150, 20).
        setSize(40, 15).
        setFont(font).
    
        setMode(ControlP5.SWITCH);
    
      cp5.addButton("erase").
        setPosition(890, 20).
        setSize(100, 30).
        setFont(font);
    }
    
    void draw() {
    
    
      fill(246, 246, 246);
      stroke(246, 246, 246);
      rect(0, 0, 1000, 80);
    
      stroke(0);
      if (mousePressed == true && onOff == true) {
        line(mouseX, mouseY, pmouseX, pmouseY);
      }
    }
    
    void keyPressed() { 
      if (erase == true) {
        background(255);
      }
    }
    

    或者,您可以完全跳过布尔值,只需在擦除按钮调用的函数中调用背景。如果函数与按钮同名,当您单击该按钮时它会自动获取:

    import controlP5.*;
    
    ControlP5 cp5;
    
    
    boolean onOff = false;
    
    void setup() {
      size(1000, 1000);
      background(255);
      PFont font = createFont("Calibri", 15);
    
    
      cp5 = new ControlP5(this);
    
      cp5.addToggle("onOff").
        setPosition(150, 20).
        setSize(40, 15).
        setFont(font).
    
        setMode(ControlP5.SWITCH);
    
      cp5.addButton("erase").
        setPosition(890, 20).
        setSize(100, 30).
        setFont(font);
    }
    
    void draw() {
    
    
      fill(246, 246, 246);
      stroke(246, 246, 246);
      rect(0, 0, 1000, 80);
    
      stroke(0);
      if (mousePressed && onOff) {
        line(mouseX, mouseY, pmouseX, pmouseY);
      }
    }
    
    void erase() { 
      background(255);
    }
    

    【讨论】:

    • 非常感谢您的回复。现在可以了。感谢您的帮助。
    • 感谢您的接受。您还应该检查 Mady Daby 的答案。这是一个优雅的解决方案,值得您投票
    • 非常感谢您的解决方案。现在,我有了更广泛的知识,一切都按其应有的方式工作。非常感谢您的帮助,我非常感谢。亲切的问候。
    【解决方案2】:

    我使用了Button 类和Toggle 类,这样我就可以使用Button::isPressed 函数来检查是否按下了擦除按钮。然后,由于您希望在单击按钮时将其擦除,因此您应该使用 mousePressed 而不是 keyPressed 函数。

    import controlP5.*;
    
    ControlP5 cp5;
    
    Button erase;
    Toggle onOff;
    
    void setup(){
      size(1000, 1000);
      background(255);
      
      PFont font = createFont("Calibri", 15);
      cp5 = new ControlP5(this);
    
      onOff = new Toggle(cp5, "onOff").
      setPosition(150, 20).
      setSize(40, 15).
      setFont(font).
      
      setMode(ControlP5.SWITCH);
      
      erase = new Button(cp5, "Erase").
      setPosition(890, 20).
      setSize(100, 30).
      setFont(font);
    }
      
    void draw(){
      fill(246, 246, 246);
      stroke(246, 246, 246);
      rect(0,0, 1000, 80);
      
      stroke(0);
      
      if(mousePressed && onOff.getBooleanValue()) {
         line(mouseX, mouseY, pmouseX, pmouseY);
      }
    }
    
    void mousePressed(){
      if(erase.isPressed()){
         background(255);
      }
    }
    

    【讨论】:

    • 将变量分配给控件并简单地重用它比原始代码更优雅(+1)
    • @Mady Daby。哇!非常感谢。这真的很有帮助。它现在完美无缺。我非常感谢您的时间和精力。你太棒了!!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-15
    相关资源
    最近更新 更多