在Java中将图像移动到点(而不是拖动)

时间:2011-07-07 14:57:51

标签: java swing graphics

我在JPanel中有一个小图片。当我单击面板时,图像必须移动到该点。 这是鼠标侦听器的代码(在构造函数中):

addMouseListener(new MouseAdapter(){
    public void mouseClicked(MouseEvent e) {
        if (moving) return;
        moveImageTo(e.getX(), e.getY());
    }
});

moveImageTo

public void moveImageTo(int x, int y) {
    moving = true;
    moveThread.start();
}

线程是问题,因为我有起始位置(java.awt.Point)和结束位置(另一个java.awt.Point),但我不知道如何计算方向和步骤移动。我还认为线程必须在每一步都调用paint(Graphics g)方法。任何人都有任何提示或链接?

2 个答案:

答案 0 :(得分:2)

我猜你不想根据你的问题一步一步地移动图像,而是想要在几毫秒内进行“平滑”移动 - 所以图像看起来是滑动到位而不是移动一个人进入新职位? 在这种情况下,你需要决定这一举动需要多长时间 - 例如500毫秒,你将采取多少步骤 - 比如说40步。 拥有起始坐标(称为startXstartY)和结束坐标(endXendY),然后很容易计算每一步的移动(此代码将发生在将在线程中运行的Runnable类中:

...
private static final int STEPS = 40;
private static final long INTERVAL = 500;//msec
private static final long STEP_INTERVAL = INTERVAL / STEPS;
...
private int stepX, stepY;
...
public void computeMovement() {
 stepX = (endX - startX) / STEPS;
 stepY = (endY - startY) / STEPS;
}
...
public void run() {
 int currX = startX;
 int currY = startY;
 computeMovement();
 for( int i = 0; i < STEPS; i++ ) {
   currX += stepX;
   currY += stepY;
   //move image to (currX, currY)
   TimeUnit.MILISECONDS.sleep( STEP_INTERVAL );
 }
}

以上是一个非常粗略和准备好的示例,但它旨在向您展示如何在单独的线程中逐步移动图像。

答案 1 :(得分:-1)

进入run()添加一种方法,每次刷新时将图像移动一堆像素,直到达到e.getX()e.getY()。尝试一下找一个不错的px / s组合