我正在制作一个程序,试图对在屏幕上移动的卡片进行动画处理,就好像您实际上是从桌子上拔出它一样。这是动画的代码:
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到最终位置的跳转。
move()
为什么会这样呢?任何人都可以批评/改善我的代码吗?谢谢!
问题是您Thread.sleep()在事件调度线程中调用导致GUI变得无响应。为了避免这种情况,您可能需要改用Swing Timer:
Thread.sleep()
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是指示动画必须停止一个布尔标志。
stop