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,并尝试发布一份不包含注释或未使用代码的草图副本。这将使扫描/阅读变得更容易,因此更多的人将更容易提供答案。祝你好运!嗨,卡丁,非常感谢你,它现在起作用了!