Переместить изображение в точку (не перетаскивать) в Java - PullRequest
0 голосов
/ 07 июля 2011

У меня есть небольшое изображение в JPanel.Когда я нажимаю на панель, изображение должно двигаться к этой точке.Это код слушателя мыши (в конструкторе):

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

The moveImageTo:

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

Поток является проблемой, потому что у меня есть начальная позиция ( java.awt.Point ) и конечная позиция (еще java.awt.Point ), но я не знаю, как рассчитать направление и шаг перемещения.Я также думаю, что поток должен вызывать метод paint(Graphics g) на каждом шаге.У кого-нибудь есть намеки или ссылки?

Ответы [ 2 ]

2 голосов
/ 07 июля 2011

Я предполагаю, что вы не хотите перемещать изображение за один шаг, основываясь на вашем вопросе, но вместо этого вы хотите «плавное» движение в течение нескольких миллисекунд - поэтому изображение кажется, что оно перемещается в положение, а не перемещается в один перейти в новую позицию? В этом случае вам нужно решить, сколько времени займет этот шаг - например, 500 миллисекунд и сколько шагов вы будете делать, скажем, 40 шагов. Имея начальные координаты (назовите их startX и startY) и конечные координаты (endX и endY), легко вычислить движение на каждом шаге (этот код будет выполняться в вашем классе 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 );
 }
}

Вышеприведенный пример является очень грубым и готовым примером, но он предназначен для того, чтобы показать вам, как вы можете перемещать изображение поэтапно в отдельном потоке.

0 голосов
/ 07 июля 2011

В run() добавьте метод для перемещения изображения на несколько пикселей при каждом обновлении до достижения e.getX() и e.getY().Попробуйте немного найти хорошую комбинацию пикселей / с

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...