我正在尝试在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循环中这样做,因为据我所知,当一个元素被移除时,向量将“重新包装”,我将跳过向量的一个元素。说/做这个不确定我是对还是错。
答案 0 :(得分:3)
由于您已将Vector v
定义为原始类型向量,因此它不知道其中的元素类型,即v.elementAt(i)
,因此无法找到与contains()
方法匹配的内容。这就是问题的原因。
您有两种选择。在调用Vector
方法之前定义type cast
或contains()
元素时使用泛型。
e.g。
Vector<Rectangle> v = (Vector<Rectangle>)ball.r;
或
if(((Ractangle)v.elementAt(i)).contains(p))
答案 1 :(得分:3)
Java Vector可以用作generic或非通用。并且您使用非泛型。因此,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++;
}
}
请记住,您可以将泛型集合分配给非泛型引用,但不能将非泛型对象分配给泛型引用。您可以了解泛型here。
答案 2 :(得分: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;
希望这有帮助!