处理嵌套类

时间:2018-06-11 03:40:02

标签: nested processing

我正在使用Processing 3为伺服控制器制作GUI而不是使用预制库。它基于一个打包类组织几个子类,这些子类使用registerMethod鼠标事件来操作(而不是在主草图中更简单地使用mousePressed())。我要挂起的是每个类的PApplet命名/术语,以确保它们可以在子类内部以及从main调用时自行运行。在我的示例中,包只是一个按钮,以及用于比较的直接按钮调用。我知道大多数Java用户认为Applet使用过时,但由于我只是使用Processing IDE,我想更好地理解这个概念,并尽量避免使用更复杂的东西(但可能不那么混乱)就像一个接口。

PackServ tryMe;
Butt bOne;

void setup() {
  size(200, 150);
  tryMe = new PackServ(this);
  bOne = new Butt(this);
}

void draw() {
  background (250);

  tryMe.Add(20, 10, 50);
  line(100,10,100,100);
    fill(130,255,170);
  rect(120,10,50,60,5);
  bOne.Add("B2", 145,35,25);
    stroke(20); textSize(14); fill(25);
  text("single", 130,100);
  text("package", 20,100);
}

public class PackServ extends PApplet {
  PApplet SerApp;
  Butt Butt1, Butt2;
  String theName;
  int pkX, pkY, pkW;

  PackServ(PApplet pa) {
   this.SerApp = pa;
    theName = "The Slider";
    pkX = 20; 
    pkY = 20; 
    pkW = 100;
  }

  void Add(int _x, int _y, int _w) {
    pkX = _x; pkY = _y; pkW = _w;  
    Butt1 = new Butt (this);
    drawIt();
  }
  void drawIt() {
    SerApp.fill(200); 
    SerApp.strokeWeight(1);
    SerApp.rect(pkX, pkY, pkW, 60, 5);
     Butt1.Add("B1", pkX+25, pkY+25, 25);
  }
} 

public class Butt
{
  PApplet butApp;
  int theX, theY, theW, theH, bRad;
  boolean pressed = false;
  color n;                             
  color h = color(240, 210, 10);         
  color f = color (40, 90, 190);          
  color a = color (240, 20, 20);           
  int oBb, li;
  String theLabel;

  Butt (PApplet butApplet) {
    this.butApp = butApplet;
    butApp.registerMethod("mouseEvent",this);
    n = f;
  }
  void Add(String _myName, int x, int y, int siz) {
    theLabel = _myName;
    theX = x;   
    theY = y; 
    bRad = siz;
    fill(75); 
    textSize(9);
    buttonLook();
  }
boolean overB(int mx, int my) {
    if (dist (mx, my, theX, theY) <= bRad) {
      return true;
    } else {
      return false;
    }
  }
  void buttonLook() {
    if (overB(mouseX, mouseY) && pressed) {
      n = a; 
      oBb = 3; li = 100;
    } else if (overB(mouseX, mouseY)) {
      text(theLabel, theX-10, theY+25);   
      n = h;
    } else {
      n = f; oBb=1; li=25;
    }
    strokeWeight(oBb); 
    stroke(li); 
    fill(n);
    ellipse(theX, theY, bRad, bRad);
  }
  void mouseEvent(MouseEvent e) {
    pressed = false;
    int mx = e.getX(), my = e.getY();   
    switch (e.getAction()) {
    case MouseEvent.PRESS:
      pressed = overB(mx, my);
      break;
    }
  }
}

1 个答案:

答案 0 :(得分:-1)

我不完全确定你在问什么,所以让我试着回答你似乎有些困惑的一些不同的事情。

  

我知道大多数Java用户认为Applet使用过时的

请注意,除了名称之外,PApplet与applet无关。从历史上看,PApplet是一个小程序,但从处理3开始,情况就不再如此。 PApplet是它自己的东西,与applet无关。

让我们仔细看看这段代码:

public class PackServ extends PApplet {
  PApplet SerApp;
  PackServ(PApplet pa) {
    this.SerApp = pa;
    ...

扩展PApplet并将PApplet参数放入构造函数中没有多大意义。这意味着您现在有两个PApplet实例,这几乎不是您想要做的。

相反,我的猜测是你可能想要摆脱extends PApplet部分,只使用你的serApp变量使用Processing的类。

我认为这是你困惑的关键:PApplet类提供了许多方便的函数,如draw()ellipse(),基本上是Processing参考中的大多数变量和函数。因此,您确实需要PApplet的实例,但在使用Processing编辑器时会为您创建该实例。您无需通过扩展PApplet类来创建自己的实例。