我有一个问题,我必须用我的代码来解决。所以我有一个棋盘格,当我点击我想要拖动的东西(即检查器)时,我会看到一个标签,上面有它的图片(我知道这不是很好的解决方案,但我被告知这样做)在一个公式计算的适当的地方。我想使用相同的公式来计算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只是我在下面使用的变量。这些计算对我来说似乎没问题,但是它们让我只能以一种根本不移动的方式(例如我拖动透明的东西)来驱动检查器,当我最终进入一个新的位置时它被涂在那里等等。不是一个流畅的拖拽,但它在拖动过程中被绘制在光标下的字段中。
由于电路板不是从(0,0)开始,+ 42和+ 37只是在适当的位置计算它的一些数字。
答案 0 :(得分: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);