我有这个HashMap:
private static HashMap<Point, Point> points = new HashMap<>();
每当我为一个用作该HashMap中的值的Point调用.setLocation()时,它将从其匹配键的值中删除 - 或者更确切地说设置为null。
valPoint.setLocation(mouseX, mouseY);
valPoint的位置将设置为mouseX和mouseY,但是当我尝试通过.get()从HashMap访问它时,它返回null。
每当我移动鼠标时,都会从回调函数调用.setLocation()函数。
我尝试在回调函数之外再现它。在Map中放入一对并为值Point调用.setLocation()后,从Map访问它时它仍会返回相同的Point。
为什么会这样?
这里有一些代码:
private static HashMap<Point, Point> points = new HashMap<>();
private static Point drawPoint = null;
@Override
public void start(Stage stage) {
//somecode
scene.setOnMouseMoved(e -> mouseMovedOrDragged(e));
scene.setOnMousePressed(e -> mousePressed(e));
//somecode
}
private static void mousePressed(MouseEvent e) {
drawing = true;
drawPoint = addPoint(mouseX, mouseY, lastPoint);
lastPoint = drawPoint;
//stuff
}
private static void mouseMovedOrDragged(MouseEvent e) {
mouseX = e.getSceneX();
mouseY = e.getSceneY();
moveDrawPoint();
//bla
}
private static void moveDrawPoint() {
if (drawing)
drawPoint.setLocation(mouseX, mouseY);
}
答案 0 :(得分:2)
您的观点不会从地图中删除。但是,我非常确定,一旦您更改了位置,您就会更改Point
对象的 hashCode ,这与您{中的任何键都不匹配{1}}了。
请参阅HashMap
java.awt.geom.Point2D.hashCode()
因此/**
* Returns the hashcode for this <code>Point2D</code>.
* @return a hash code for this <code>Point2D</code>.
*/
public int hashCode() {
long bits = java.lang.Double.doubleToLongBits(getX());
bits ^= java.lang.Double.doubleToLongBits(getY()) * 31;
return (((int) bits) ^ ((int) (bits >> 32)));
}
值取决于hashCode
和x
值,并会发生变化。
这就是为什么您的y
密钥应该是不可变,或者至少有一个Map
值不会因突变而改变。