Java 从主类中的矩形类调用方法

Java 从主类中的矩形类调用方法,java,oop,user-interface,processing,implementation,Java,Oop,User Interface,Processing,Implementation,我试图从主类中的矩形类中检索一个方法,但它不起作用。目标是用户单击矩形按钮,然后出现一个矩形。但是,矩形不能再次消失。此外,用户应该能够更改大小和位置等属性 我不确定是否应该尝试回调函数?我非常感谢你的帮助 提前多谢 import controlP5.*; import de.bezier.data.sql.*; Rectangle rect; Button rc; int posX = 50; int posY = 60; int w = 100; int h = 150; //R

我试图从主类中的矩形类中检索一个方法,但它不起作用。目标是用户单击矩形按钮,然后出现一个矩形。但是,矩形不能再次消失。此外,用户应该能够更改大小和位置等属性

我不确定是否应该尝试回调函数?我非常感谢你的帮助

提前多谢

import controlP5.*;
import de.bezier.data.sql.*;

Rectangle rect;
Button rc;


int posX = 50; 
int posY = 60; 
int w = 100;
int h = 150;

//Rectangle r = new Rectangle(posX, posY, w, h);

public void drawButton() {
   fill(230, 230, 255);
   stroke(0);
   rect(50, 60, 100, 150);
   
  

}
public boolean isMouseInsideRectangleButton() {
   return mouseX > posX && mouseX < posX + w
           && mouseY > posY && mouseY < posY + h;
}


ControlP5 cp5;

SQLite db;

void setup(){
  size(1000, 1000);
  //background(255);
  PFont font = createFont("Calibri", 15);
  
  rect = new Rectangle(250, 500, 100, 100);

  
  cp5 = new ControlP5(this);
  
  cp5.addButton("Save").
  setPosition(770, 20).
  setSize(100, 30).
  setFont(font).
  setColorBackground(color(52, 55, 76));
  
  cp5.addButton("erase").
  setPosition(890, 20).
  setSize(100, 30).
  setFont(font).
  setColorBackground(color(52, 55, 76));
  
  cp5.addButton("Upload").
  setPosition(650, 20).
  setSize(100, 30).
  setFont(font).
  setColorBackground(color(52, 55, 76));
  
  
  rc = cp5.addButton("Rectangle").
  setPosition(5,4).
  setSize(100, 20).
  setFont(font).
  setColorBackground(color(52, 55, 76));
   
   rc.onRelease(new CallbackListener() {
     public void controlEvent(CallbackEvent theEvent)
     
     {
       rect.draw();
     }
     
   
}
   );
   
}
  
  
  
  
  //cp5.addButton("Triangle").
  //setPosition(5,42).
  //setSize(100, 20).
  //setFont(font).
  //setColorBackground(color(52, 55, 76));
  
  //cp5.addButton("Ellipse").
  //setPosition(165, 4).
  //setSize(100, 20).
  //setFont(font).
  //setColorBackground(color(52, 55, 76));
  
  //cp5.addButton("circle").
  //setPosition(165,42).
  //setSize(100, 20).
  //setFont(font).
  //setColorBackground(color(52, 55, 76));







void draw(){
  
  background(255);
  fill(246, 246, 246);
  stroke(246, 246, 246);
  rect(0,0, 1000, 80);
  
 

  
 


//public void mousePressed() {
//  if (isMouseInsideRectangleButton()) {
//      //r.setDrawColorful(!r.getDrawColorful());
//      r.draw();
//  }
  
}


public class Rectangle
{
  private int posX, posY, w, h;
  
  
  private boolean drawColorful = false;
  
  
  //constructor
  
  public Rectangle(int posX, int posY, int w, int h) {
    this.posX = posX;
    this.posY = posY;
    this.w = w;
    this.h = h;
  
}

public boolean getDrawColoful(){
  return this.drawColorful;
}

public void setDrawColorful(boolean flag) {
    this.drawColorful = flag;
  }
  
  
  public void setPosX(int posX){
    this.posX = posX;
  }
  
  public int getPosX(){
    return posX;
  }
  
   public void setPosY(int posY){
    this.posY = posY;
  }
  
  public int getPosY(){
    return posY;
  }
  
   public void setW(int w){
    this.w = w;
  }
  
  public int getW() {
    return w;
  }
  
  public void setH(int h) {
    this.h = h;
  }
  
  public int getH() {
    return h;
  }

    
  
  
  
  

public void draw() {

 if (this.drawColorful) {
      fill(255,255,0);
      stroke(0,0,255);
      
      
      
    } else {
      fill(255,255,255);
      stroke(0,0,0);
    }

rect(posX, posY, w, h) ;




}

}
事实上,它正在工作。当您单击按钮时,rect.draw函数将激发。您可以通过在回调函数中放置print语句来验证这一点:

rc.onRelease(new CallbackListener() {
  public void controlEvent(CallbackEvent theEvent)
  {
    println("rect.draw() fired!");
    rect.draw();
  }   
});
您的问题是,当单击按钮时,矩形仅在单个瞬间绘制。您的主绘制循环在不调用rect.draw的情况下保持循环,这样您就再也看不到它了

有很多方法可以重新构造代码,使矩形保持在屏幕上。一个选项是在单击按钮之前不实例化矩形

然后,在主绘制循环中,您可以检查矩形是否存在,如果存在,则将其绘制到屏幕上。由于每次循环都会发生这种情况,所以一旦创建了矩形,您将始终在屏幕上看到它,并且您可以更新矩形的尺寸,并在屏幕上看到它的更新

下面是一个简短的示例来说明我所说的未显示的矩形类:

import controlP5.*;

Rectangle rect; // rect begins as null
Button rc;

ControlP5 cp5;

void setup(){
  size(1000, 1000);

  PFont font = createFont("Calibri", 15);
  
  // don't create the rectangle here!
  //rect = new Rectangle(250, 500, 100, 100);

  cp5 = new ControlP5(this);
 
  // ... setup other controls here
  
  rc = cp5.addButton("Rectangle").
  setPosition(5,4).
  setSize(100, 20).
  setFont(font).
  setColorBackground(color(52, 55, 76));
   
  rc.onRelease(new CallbackListener() {
    public void controlEvent(CallbackEvent theEvent)
    {
      // only create the rectangle when the button is clicked
      rect = new Rectangle(250, 500, 100, 100);
    }
  });

}
  
void draw(){
  background(255);
  fill(246, 246, 246);
  stroke(246, 246, 246);
  rect(0,0, 1000, 80);
  
  // if the rect exists, draw it on the screen
  if(rect != null) {
     rect.draw(); 
  }
}

卡丁的答案是+1。我只是想对未来的问题提出一些建议:请格式化代码Ctrl+T/CMD+T,并尝试发布一份不包含注释或未使用代码的草图副本。这将使扫描/阅读变得更容易,因此更多的人将更容易提供答案。祝你好运!嗨,卡丁,非常感谢你,它现在起作用了!