小编典典

Thread.sleep()停止绘画?

java

我正在制作一个程序,试图对在屏幕上移动的卡片进行动画处理,就好像您实际上是从桌子上拔出它一样。这是动画的代码:

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

此矩形对象位于jframe内的面板内。为了重新粉刷面板,我有这个:

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

这是一个线程,每隔50毫秒重新绘制一次gamePanel。

现在,我意识到这可能不是执行此类操作的最佳方法。如果有更好的方法来完成整个重新粉刷工作,请通知我!

但是,我遇到的问题是,当我move()为矩形调用命令时,它会通过线程,但是图像不会更新到最后,因此只是从点a到最终位置的跳转。

为什么会这样呢?任何人都可以批评/改善我的代码吗?谢谢!


阅读 206

收藏
2020-10-16

共1个答案

小编典典

问题是您Thread.sleep()事件调度线程中调用导致GUI变得无响应。为了避免这种情况,您可能需要改用Swing
Timer

   Timer timer = new Timer(50, new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            if(!stop) {
                gamePanel.repaint();
            } else {
                ((Timer)e.getSource()).stop();
            }
        }
    });
    timer.setRepeats(true);
    timer.setDelay(50);
    timer.start();

哪里stop是指示动画必须停止一个布尔标志。

2020-10-16