【发布时间】:2014-03-18 05:05:59
【问题描述】:
我正在从事一个计算机科学项目,并且被这个问题困扰了将近 72 小时。我已经谷歌了,重新谷歌了,第三次谷歌了。不知何故,我似乎无法让它工作。基本上,我必须绘制一个迷宫,然后为解决方案路径设置动画。这是我目前的绘画代码,绘制迷宫效果很好,我根本无法让它动画。
private class MazePanel extends JPanel
{
@Override
public void paintComponent(Graphics g)
{
super.paintComponent(g);
MazeApp.g = (Graphics2D) g;
paintMaze();
}
}
...
private static Timer timer = new Timer(1000, new ActionListener(){
private int space = 0;
@Override
public void actionPerformed(ActionEvent e)
{
Point3d p = solutionSpaces.get(space);
g.fillRect((int)p.x * spaceLength, (int)p.y * spaceWidth, spaceLength, spaceWidth); // g is static reference to Graphics2D, set from MazePanel
mazePanel.repaint(); //mazePanel is instance
space++;
}
});
...
private void paintMaze()
{
if (this.reader != null)
{
for (int col = 0; col < this.reader.getWidth(); col++)
{
for (int row = 0; row < this.reader.getLength(); row++)
{
MazeConstruct c = reader.check(row, col, floor);
if (c == MazeConstruct.WALL)
g.setColor(Color.BLACK);
else if (c == MazeConstruct.ELEVATOR)
g.setColor(Color.YELLOW);
else if (c == MazeConstruct.START)
g.setColor(Color.CYAN);
else if (c == MazeConstruct.FINISH)
g.setColor(Color.RED);
else if (c == MazeConstruct.OPEN)
g.setColor(Color.GRAY);
if (c != MazeConstruct.SOLUTION && c != MazeConstruct.TRAVERSED)
g.fillRect(row * spaceLength, col * spaceWidth, spaceLength, spaceWidth);
g.setColor(Color.DARK_GRAY);
g.drawRect(row * spaceLength, col * spaceWidth, spaceLength, spaceWidth);
}
}
}
if (solving)
{
timer.setInitialDelay(0);
timer.start();
}
}
提供的代码将立即充分绘制完整的解决方案,但我需要它以动画的形式逐步遍历每个单独的空间。请帮我。这绝对是我最后的手段!如果我需要提供任何其他信息,请告诉我。此外,欢迎建设性 批评。太感谢了。
[编辑] 我在这里发现了一个随机问题,该问题说明了一个普遍的观点,即计时器的滴答声 (actionPerformed()) 应该只更新数据的状态(例如,移动到下一个空间)而不是实际绘画,以及图形g 不应在paintComponent 调用之后保持。我将使用这些新的小信息来解决我的问题。仍然欢迎回答。
【问题讨论】:
标签: java swing animation paintcomponent maze