我有一个任务,我必须通过PApplet处理器显示“健身机”和它们的数据。我需要使用多态性和继承(跑步机是一个GymMachine,等等)。每台健身房机器都必须有自己的绘图方法。我就是想不出怎么避免NullPointerException。
这是我的"ProcessingExample.java“文件中的代码,即通过处理器实际绘制图像的代码:
import processing.core.PApplet;
import processing.core.PImage;
public class ProcessingExample extends PApplet {
public long start_time;
public static int canvas_x = 1200;
public static int canvas_y = 800;
TreadMill treadmill;
Stepper stepper;
Bicycle bicycle;
public ProcessingExample(){
start_time = System.currentTimeMillis();
}
public void setup(){
size(canvas_x, canvas_y);
treadmill = new TreadMill();
stepper = new Stepper();
bicycle = new Bicycle();
}
public void draw(){
// treadmill
treadmill.draw();
}
}这是我的GymMachine类,跑步机将从它派生:
import processing.core.PApplet;
import processing.core.PImage;
public class GymMachine extends PApplet {
public long start_time;
public static int canvas_x = 1200;
public static int canvas_y = 800;
public GymMachine(){
start_time = System.currentTimeMillis();
}
public void draw(){ // for now I am just trying to draw the background, a block of color on 1/3 of the canvas
fill(83, 85, 171);
rect(0, 0, canvas_x / 3, canvas_y);
}
}为了清楚起见,这里是我的跑步机课程:
import processing.core.PApplet;
import processing.core.PImage;
public class TreadMill extends GymMachine {
private int angleOfInclination;
private double mph;
public TreadMill(){
angleOfInclination = 1;
mph = 1.0;
image = "treadmill.png";
}
public TreadMill(int i, double m){
if (i >= 1 && i <= 15){ // data validation
angleOfInclination = i;
}
else { // else, defer to defaults
angleOfInclination = 1;
}
if (m >= 1.0 && m <= 15.0){
mph = m;
}
else {
mph = 1.0;
}
}
public void setAngleOfInclination(int i){
if (i >= 1 && i <= 15){ // data validation
this.angleOfInclination = i;
}
}
public void setMPH(double m){
if (m >= 1.0 && m <= 15.0){ // data validation
this.mph = m;
}
}
public long getCaloriesUsed(){
return 20 *(long) mph + 15 * angleOfInclination;
}
public String toString(){
return "Angle of inclination is " + angleOfInclination + " degrees; Speed is " + mph + " mph; Calories burned: " + this.getCaloriesUsed();
}
}在过去的5个小时里,我一直不明白为什么treadmill.draw()会抱怨NullPointerException。我不太确定null变量是什么。我尝试使ProcessingExample和GymMachine成为同一个类,因为我认为它可能需要访问“相同的画布”,但问题是ProcessingExample一直在调用自己,因为我需要在某个地方创建一个跑步机实例。我也读到过,我可以让构造函数接受PApplet类型的参数,而不是制作GymMachine extend PApplet,(即GymMachine(PApplet p){...}),但是我不能从这个派生出TreadMill。任何帮助都是非常感谢的。
发布于 2018-04-26 00:14:16
只有一个类应该扩展PApplet类。
可以将PApplet看作是在窗口中运行的整个草图。您只想显示一个窗口,对吧?所以您只需要一个PApplet类。
您不希望每个GymMachine都显示在它自己的窗口中。您希望在一个窗口中绘制多个GymMachines。因此,去掉GymMachine类上的extends PApplet。
这样做之后,您将得到一些编译器错误,因为GymMachine类无法识别fill()或rect()等函数。要解决这个问题,您需要将主sketch类(扩展PApplet的类)的一个实例传递给辅助sketch类。this关键字在这方面派上了用场。
最后,您必须使用对主PApplet草图的引用来调用处理函数。下面是一个例子:
public class MySketch extends PApplet{
Thing thing = new Thing(this);
public void draw(){
thing.draw();
}
}
public class Thing{
PApplet mainSketch;
public Thing(PApplet mainSketch){
this.mainSketch = mainSketch;
}
public void draw(){
mainSketch.ellipse(100, 100, 100, 100);
}
}有关详细信息,请参阅this tutorial的从非草图类调用处理函数一节。
https://stackoverflow.com/questions/50014263
复制相似问题