我正在学习多态并遇到一些问题。我本来应该制作一个“屏幕保护程序”,不同的图像移动和弹跳。我使用四个子类型Square,Star,Circle和Triangle的数组工作,但是我一次只能有一个类的一个实例(当我点击时,它会形成一个新的形状而旧的形状消失)。
我试图像这样制作一个arraylist:
public void mouseClicked(MouseEvent e) {
if (i < 3) {
i += 1;
} else {
i = 0;
}
switch (i) {
case 0:
shapeArray.add(new Circle());
break;
case 1:
shapeArray.add( new Square());
break;
case 2:
shapeArray.add( new Star());
break;
case 3:
shapeArray.add(new Triangle());
break;
}
shapeArray.get(i).setX(e.getX());
shapeArray.get(i).setY(e.getY());
repaint();
animationTimer.start();
j += 1;
}
但是当我在paintComponent中调用我的draw方法 -
时 public void paintComponent(Graphics g) {
super.paintComponent(g);
this.setBackground(Color.BLACK);
shapeArray.get(i).draw(g, this);
// shapeArray.get(i).bounce(g, this);
}// end paintComponent
- 我从draw方法的调用中得到错误。我是在正确的轨道上吗?如何使用超类arraylist调用子类型的这种方法?
编辑: 抽象超类:
public abstract class Shapes {
Graphics g;
protected int width = 0;
protected int height = 0;
protected int x = 0;
protected int y = 0;
int d = 5;
int c = 5;
Random myRandom = new Random();
protected Color colorArray[] = {new Color(255,0,0),new Color(255,179,0),new Color(255,255,0),
new Color(7,225,0),new Color(0,127,225),new Color(205,0,255)};
protected Color color;
public Integer RandomNum(Integer x){
myRandom = new Random();
return myRandom.nextInt(x);
}
abstract public void draw(Graphics g, JPanel jp);
abstract public void bounce(Graphics g,JPanel jp);
public void setWidth(Integer width) {
this.width = width;
}
子类构造函数和绘制方法:
public Circle() {
this.x = 0;
this.y = 0;
this.width = RandomNum(100);
this.height = width;
this.color = colorArray[RandomNum(6)];
}
public void draw(Graphics g, JPanel jp) {
Graphics2D g2d = (Graphics2D) g;
int radius = width;
Point2D center = new Point2D.Float((x + width / 2), (y + height / 2));
Point2D focus = new Point2D.Float(x - (radius * 0.6f), y
- (radius * 0.6f));
float[] dist = { 0.1f, 0.2f, 1.0f };
Color[] colors = { Color.WHITE,
color, color };
RadialGradientPaint p = new RadialGradientPaint(center, radius, focus,
dist, colors, CycleMethod.NO_CYCLE);
if (g2d != null) {
g2d.setPaint(p);
int r2 = radius / 2;
g2d.fillOval(x - r2, y - r2, radius, radius);
}
// g.setColor(colorArray[RandomNum(colorArray.length)]);
// g.fillOval(x, y, width, height);
}
答案 0 :(得分:0)
好吧,如果你一次只有一个形状,你不需要一个ArrayList开始;只需要一个Shapes类型的变量(或者你的超类被调用的任何变量),你可以在你的那个开关内分配一个新的Circle或者新的Square或者其他任何东西。
但是,使用ArrayList,我发现可能存在两个问题:首先,您可能只是使用基本的ArrayList而不是您的类型的ArrayList(即private ArrayList shapesArray
而不是private ArrayList<Shapes> shapesArray
) ;第二,你的Shapes类没有抽象的setX / setY方法,因此你在mouseClicked中切换后会出现错误。