Thread.sleep () parando minha pintura?

Estou criando um programa que está tentando animar um cartão que se move pela tela como se você o tivesse tirado de uma mesa. Aqui está o código para a animação:

public void move(int x, int y) {
    int curX = this.x; //the entire class extends rectangle
    int curY = this.y;

    // animate the movement to place
    for (int i = curX; i > x; i--) {
        this.x = i;
    }

    this.x = x;
    this.y = y;
}

esse objeto retangular está dentro de um painel dentro de um jframe. para repintar o painel, eu tenho o seguinte:

public void run() {
    while (Core.isRunning()) {
        gamePanel.repaint(); //panel in which my rectangle object is in

        try {
            Thread.sleep(50);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

este é um tópico, repintando o gamePanel a cada 50 milissegundos.

Agora, percebo que essa pode não ser a melhor maneira de fazer esse tipo de coisa. se houver uma maneira melhor de fazer toda essa repintura, por favor me informe!

Mas, o problema que estou tendo é quando ligo para omove() comando para o meu retângulo, ele passa pelo thread, mas a imagem não é atualizada até o final, portanto, é apenas um salto do ponto a para o local final.

Por que isso está acontecendo? alguém pode criticar / melhorar meu código? obrigado!