Java Point setLocation()删除HashMap的值<point,point =“”>

时间:2017-09-06 18:06:35

标签: java dictionary javafx hashmap point

我有这个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);
}

1 个答案:

答案 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))); } 值取决于hashCodex值,并会发生变化。

这就是为什么您的y密钥应该是不可变,或者至少有一个Map值不会因突变而改变。