Processing + ControlP5库 - 构造函数未更新

时间:2015-09-29 19:30:45

标签: class constructor processing

我有3个类,每个类都有一个创建Textfield,Button或Textlabel的方法。我已经设置了我的程序,以便Textfield提示您输入名称,然后将其存储在name1 String变量中。我也使用了一个包含setText(name1)的Textlabel,但是当我运行它时,它就是说NullPointer。我做了很多测试,发现问题出在构造函数中,因为我相信构造函数在开头就做了它的事情,即使变量name1发生了变化,它也不会“更新”或重新构造。我该怎么做呢?

班级:

public class Textlabel {
  int x;
  int y;
  String name;
  String text;
  int txtColor;
  int txtSize;
  String group;

 Textlabel(int _x, int _y, String _name, String _text, int _txtColor, int _txtSize, String _group) {
    x = _x;
    y = _y;
   name = _name;
   text = _text;
   txtColor = _txtColor;
   txtSize = _txtSize;
   group = _group;
 }
}

实际绘制Textlabel的对应函数:

void createTextLabel(int num) {
  cp5.addTextlabel(tl[num].name)
   .setFont(createFont("TradeGothic-Bold", tl[num].txtSize))
    .setColor(tl[num].txtColor)
     .setText(tl[num].text)
      .setPosition(tl[num].x, tl[num].y)
        .setGroup(tl[num].group);
}

构造函数:

String name1;

Textlabel tl[] = {
new Textlabel(255, 271, "Contact 1 Text", name1, #ffffff, 37, "g4"), 

 };

代码的另一部分是Textfield,然后是controlEvent,用于将Textfield中的文本存储到name1中。问题是构造函数做了它的事情,所以即使我在setup()中做createTextLabel(0);或者我等到用户输入文本,然后创建它,它仍然没有更新,我在声明name1时测试它,给它一个值,它总是显示值。

任何帮助表示赞赏! 谢谢!

1 个答案:

答案 0 :(得分:0)

我仍然不确定你的问题究竟是什么,但其中一个是你创建了一个名为Textlabel的类,而controlP5有一个两个,这会产生一个模糊的引用冲突。除非您想将TextLabel类重命名为其他类,否则在声明变量时需要明确使用control5.TextLabel

您尚未发布易于运行/测试的最小示例,因此根据您粘贴的内容,以下是我设法运行代码的方法:

   import controlP5.*;
ControlP5 cp5;

String name1 = "name1";//this was null in your code sample
Textlabel tl[] = {new Textlabel(255, 271, "Contact 1 Text", name1, #ffffff, 37, "g4") };

void setup(){
  size(400,400);
  cp5 = new ControlP5(this);

  //a dummy text based on the ControlP5textlabel sample just fo test.
  controlP5.Textlabel myTextlabelA = cp5.addTextlabel("label")
                    .setText("A single ControlP5 textlabel, in yellow.")
                    .setPosition(100,50)
                    .setColorValue(0xffffff00)
                    .setFont(createFont("Georgia",20))
                    ;

  createTextLabel(0);

}
void draw(){
  background(127);
  cp5.draw();
}

void createTextLabel(int num) {
  if(tl[num] != null){
    println(tl[num]);//print the data to console
    cp5.addTextlabel(tl[num].name)
     .setFont(createFont("TradeGothic-Bold", tl[num].txtSize))
      .setColor(tl[num].txtColor)
       .setText(tl[num].text)
        .setPosition(tl[num].x, tl[num].y)
  //        .setGroup(tl[num].group) //g4 needs to be added as a group to controlP5 
  ;
  }else System.err.println(num+" is invalid, use indices from 0 to " + (tl.length-1)); 
} 


public class Textlabel {
  int x;
  int y;
  String name;
  String text;
  int txtColor;
  int txtSize;
  String group;

 Textlabel(int _x, int _y, String _name, String _text, int _txtColor, int _txtSize, String _group) {
    x = _x;
    y = _y;
   name = _name;
   text = _text;
   txtColor = _txtColor;
   txtSize = _txtSize;
   group = _group;
 }
 public String toString(){
   return "x:"+x+",y:"+y+",name:"+name+",text:"+text+",txtColor:"+txtColor+",txtSize:"+txtSize+",group:"+group;
 }
}

请注意,我对分组部分进行了评论,因为它很难发短信。

您不仅没有发布易于运行的代码来复制问题,而且它看起来也非常混乱。如果您要继续以这种方式向草图添加代码,那么从长远来看,最终会遇到更多问题。