我创建的程序基本上是一个带有矩形的框架。在框架内单击的任何位置,矩形将在给定的时间内以每秒给定的帧数移动到该位置。虽然程序功能正常,但矩形(特别是其左上角)到达点击附近。矩形到达的位置与点击的实际位置之间的距离随着每次连续点击而变得看起来更大,并且足够的点击将矩形冻结到位。我希望盒子的左上角能够在我在框架内单击的确切位置相遇。
要为矩形(它是JComponent的一个子类,称为BoxComponent)设置动画,我创建了一个名为EnhancedTimer的javax.swing.Timer的子类,它会在给定的持续时间内按间隔触发事件。另外,我使用MouseAdapter收听任何鼠标按下。
以下是一些方法:
来自MoverFrame类(扩展JFrame实现ActionListener)
private void initAnimation()
{
frameRate = 60; // int
totalTime = 600; // int
dt = totalTime / frameRate; // dt is an int
t = new EnhancedTimer(dt, this, totalTime); // t is an EnhancedTimer
}
public void actionPerformed(ActionEvent e)
{
if (e.getSource() == t)
box.move(dx, dy); // box is a BoxComponent, dx and dy are doubles
}
class BoxListener extends MouseAdapter
{
public void mousePressed(MouseEvent e)
{
finalX = e.getX(); // finalX is a double
finalY = e.getY(); // finalY is a double
dx = (finalX - box.getCurrentX()) / frameRate;
dy = (finalY - box.getCurrentY()) / frameRate;
t.startTimer();
}
}
来自BoxComponent类的(扩展JComponent)
public void move(double x, double y)
{
double currX = rect.getX();
double currY = rect.getY();
rect.setFrame(currX + x, currY + y, WIDTH, HEIGHT);
repaint();
}
public double getCurrentX()
{
return rect.getX();
}
public double getCurrentY()
{
return rect.getY();
}
来自EnhancedTimer类的(扩展javax.swing.Timer)
public EnhancedTimer(int delay, ActionListener listener, long duration)
{
super(delay, listener);
t = new java.util.Timer();
dur = duration; // dur is a long
}
public void startTimer()
{
start();
t.schedule(new CloseTask(), dur);
}
class CloseTask extends TimerTask
{
public void run()
{
stop();
}
}
我一直在摆弄这个程序很长一段时间了,但我无法弄清楚为什么我的动画算法无法正常工作。也许程序有圆整错误?
如果您在我的计划中看到任何明显的设计或结构错误,请告诉我。另外,这是我的第一个问题,所以如果我给你的阅读材料多于必要的内容,我会道歉。