Processing使用ControlP5库编写图表生成函数提示不存在如何解决
错误根源
- 你自定义的
create_chart是主sketch的全局方法,不是Chart类的成员方法,你用dane.create_chart()调用相当于在Chart类里找这个方法,自然会报方法不存在 create_chart内部的this指代当前Processing sketch对象,不是你新创建的图表实例,后续的属性设置全部指向了错误对象- 你定义的
Dane类存在递归实例化问题,完全没有实际作用,可以直接删除
修正步骤
- 去掉调用时的
dane.前缀,直接调用全局的create_chart方法 - 修改
create_chart内部逻辑,将新创建的Chart实例存为局部变量,所有配置方法都基于这个实例调用,还可以返回实例方便你同时创建多个图表 - 修正参数错误:color的三个分量最大值为255,你之前写的500属于非法参数
修正后可运行代码
import controlP5.*; // 注意提前导入ControlP5包 ControlP5 gui; Chart dane; int i = 0, minimum, maximum; int zero_point; void setup() { size(1280, 720); smooth(); gui= new ControlP5(this); PFont pfont = createFont("TIMES", 20, true); ControlFont font = new ControlFont(pfont, 30); gui.setFont(font); // 直接调用全局方法即可,不需要加dane.前缀 dane = create_chart("Dane", 0, 300, 290, 415, 220, "world"); delay(100); } void draw() { textSize(15); i=i+(int(random(-50, 50))); background(45); dane.push("zero", 0); dane.push("world", i); minimum = int(min(dane.getValuesFrom("world"))); maximum = int(max(dane.getValuesFrom("world"))); if (maximum<0) maximum = 0; if (minimum>0) minimum = 0; dane.setRange(minimum, maximum); text(maximum, 390, 220); text(minimum, 390, 510); if (minimum<=0 && minimum!=maximum) { zero_point = 220 + 290*maximum/(maximum-minimum); text(0, 390, zero_point); } } // 修改返回值为Chart类型,方便创建多个图表时存到不同变量里 public Chart create_chart(String name, int chart_number, int size_x, int size_y, int position_x, int position_y, String data) { gui.printPublicMethodsFor(Chart.class); // 把新创建的图表存为局部变量 Chart chart = gui.addChart(name) .setPosition(position_x, position_y) .setSize(size_x, size_y) .setRange(-20, 20) .setView(Chart.LINE); // 所有配置都针对这个chart实例,不要用this chart.getColor().setBackground(color(100, 100)); chart.addDataSet("zero"); chart.setData("zero", new float[500]); chart.addDataSet("world"); chart.setColors("world", color(100, 100, 255)); chart.setStrokeWeight(3); return chart; }
内容的提问来源于stack exchange,提问作者Szymon Strzelczyk
相关产品推荐
相关产品推荐

