0

我有一个问题,我必须用我的代码来解决。所以我有一个棋盘,当我点击我想拖动的东西(即棋盘)时,我会看到一个包含它图片的标签(我知道这不是一个简洁的解决方案,但我被告知这样做)在通过公式计算的适当位置。我想使用相同的公式来计算 mouseDragged 事件下检查器的坐标,但这就是问题所在。如果我只是通过事件中的简单 getX() 或 getY() 设置标签的位置,那么只要我移动鼠标,它的左上角就会在我的鼠标指针下“跳跃”。我希望它在我点击它的地方粘在光标上,所以我做了这样的事情:

    public void mouseDragged(MouseEvent evt) {
        int col = (evt.getX() - 4) / 40;
        int row = (evt.getY() - 4) / 40;
        int setX = evt.getX()-(col*40);
        int setY = evt.getY()-(row*40);
        if (dragged)
            inv.setLocation(evt.getX()-setX+42, evt.getY()-setY+37);

其中 col 是我要从中拖动检查器的列的 X 坐标(行也是如此),而 setX 只是我在下面使用的变量。这些计算对我来说似乎没问题,但它们使我只能以根本不动的方式拖动检查器(就像我拖动透明的东西一样),当我最终进入棋盘上的一个新位置时它被画在那里等等。不是流畅的拖动,但在拖动过程中它被绘制在我光标下的字段中。

+42 和 + 37 只是一些在适当位置进行计算的数字,因为棋盘不是从 (0,0) 开始的。

4

1 回答 1

1

检查器的角“跳”到鼠标的原因是由于图像的绘制方式。当您设置图像的坐标时,您将设置图像的点 P(0,0),即在屏幕上绘制时的左上角。

要解决此问题,除了跟踪行号和列号外,您还需要通过鼠标在每个棋盘“单元格”中的移动来跟踪要保持的 x 和 y 偏移量(以像素为单位)。

这意味着当您单击时,您可能会单击第 2 行第 3 列中的检查器,其 (x, y) 偏移量为 (12,14)。我假设您的正方形大于 14x14 像素。

我把你的 42 变成了 BOARD_X_OFFSET 和 37 变成了 BOARD_Y_OFFSET 我已经添加了两个双精度 cellX 和 cellY ,它们在单元格内保存偏移量。

这将使您设置的位置看起来与此类似:

inv.setLocation(evt.getX()-setX+BOARD_X_OFFSET+cellX, evt.getY()-setY+BOARD_Y_OFFSET+cellY);
于 2013-06-24T19:47:18.920 回答