2013-06-24 40 views
0

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

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); 

其中山坳是列的X坐标我想糖衣片从检查(等是行),setX只是我在下面使用的一个变量。这些计算对我来说似乎没有问题,但是它们让我只能以一种根本不移动的方式来填塞棋子(就像我拖着透明的东西一样),当我最终进入棋盘上的新位置时它被涂在那里等等。不是流畅的拖拽,但拖拽时会拖拽到光标下的字段中。

+42和+37只是一些数字来计算它在适当的地方,因为董事会不是从(0,0)开始。

+0

参见本[示例](http://stackoverflow.com/a/2562685/230513)和[变化](HTTP:/ /stackoverflow.com/a/2563350/230513)。 – trashgod

回答

1

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

要解决这个问题,除了跟踪行号和列号之外,还需要跟踪每个棋盘“单元格中鼠标移动时要维护的x和y偏移量(以像素为单位) ”。

这意味着当您单击时,您可以单击第2行第3列中的检查器,并使用(12,14)的(x,y)偏移量。我假设你的方块大于14x14像素。

我把你的42,进入BOARD_X_OFFSET和37到BOARD_Y_OFFSET 我已经添加了两个双打cellX和小区j持有的细胞内的偏移量。

这会让你设定的位置类似于此:

inv.setLocation(evt.getX()-setX+BOARD_X_OFFSET+cellX, evt.getY()-setY+BOARD_Y_OFFSET+cellY);