0

我正在尝试在 mouseClicked 中创建一段代码,以删除从 Vector 中单击的所有矩形。所有矩形都正确存储在向量中,并且我正在检查的点在我运行程序时是有效的。查看文档,确实有一种rectangle.contains(point)方法,所以我不确定为什么以下代码段无效。谢谢!

public void mouseClicked(MouseEvent m)
    {

      Point p = new Point(m.getPoint());
      Vector v = ball.r; //ball.r is where they are put into in another object's method
      boolean done = false;
      int i = 0;

      while (!done)
      {
        if(v.elementAt(i).contains(p))
        {
          v.removeElement(i);
          i--; //prevent i from incrementing
        }
        i++;
      }
    }

我也没有在 for 循环中这样做,因为据我所知,当一个元素被删除时,向量将“重新打包”并且我将跳过向量的一个元素。不确定我说/这样做是对还是错。

4

3 回答 3

3

Java Vector可以用作泛型或非泛型。并且您已将其用作非泛型。所以elementAt(int index)方法返回一个Object,而不是一个Rectangle。解决此问题的最简单方法是将返回的内容强制Object转换为Rectangle对象。像这样,

import java.awt.Rectangle;  // Don't forget the to import

public void mouseClicked(MouseEvent m)
{

  Point p = new Point(m.getPoint());
  Vector v = ball.r;
  boolean done = false;
  int i = 0;

  while (!done)
  {
    if( ((Rectangle)(v.elementAt(i)).contains(p))   // casting
    {
      v.removeElement(i);
      i--;
    }
    i++;
  }
}

更好的解决方案是使用泛型。

import java.awt.Rectangle;

public void mouseClicked(MouseEvent m)
{

  Point p = new Point(m.getPoint());
  Vector<Rectangle> v = ball.r;   // remember, bar.r Vector must be a Vector<Rectagle> 
  boolean done = false;
  int i = 0;

  while (!done)
  {
    if( (v.elementAt(i).contains(p))   // No casting
    {
      v.removeElement(i);
      i--;
    }
    i++;
  }
}

请记住,您可以将泛型集合分配给非泛型引用,但不能将非泛型对象分配给泛型引用。您可以在此处了解泛型。

于 2012-11-04T22:46:39.013 回答
3

由于您已定义Vector v为原始类型向量,因此它不知道其中的元素类型,即v.elementAt(i),因此无法找到匹配该方法的contains()方法。这就是问题的原因。

你有两个选择。在调用方法之前定义Vectortype cast元素时使用泛型。contains()

例如

 Vector<Rectangle> v  = (Vector<Rectangle>)ball.r;

或者

 if(((Ractangle)v.elementAt(i)).contains(p))
于 2012-11-04T22:29:27.437 回答
2
C:\Users\Alex\Downloads\Bounce2\Bounce2.java:217: cannot find symbol symbol : method contains(java.awt.Point) location: class java.lang.Object if(v.elementAt(i).contains(p)) 

此错误消息表明编译器正在寻找类中的contains()方法Object。换句话说,v.elementAt(i)返回一个Object,而不是一个Rectangle。要解决此问题,您需要更改您的声明v如下:

Vector<Rectangle> v = ball.r;

希望这可以帮助!

于 2012-11-04T22:34:22.150 回答