用于动画填充多边形的动画的摇摆计时器?

时间:2014-04-12 19:43:37

标签: java swing animation graphics timer

我有一个算法,我已经实现了填充任何形状....但它立即填充形状没有任何延迟...我希望它显示一种动画类型,以便可以看到洪水填充算法在填充形状时起作用。

这是我的算法:

  public static void floodFill(BufferedImage image, int x,int y, int fillColor)
    {
      java.util.ArrayList<Point> examList=new java.util.ArrayList<Point>();

      int initialColor=image.getRGB(x,y);
      examList.add(new Point(x,y));

      while (examList.size()>0)
      {
        Point p = examList.remove(0);  // get and remove the first point in the list
        if (image.getRGB(p.x,p.y)==initialColor)
        {
          x = p.x;  y = p.y;
          image.setRGB(x, y, fillColor);  // fill current pixel

          examList.add(new Point(x-1,y));
          examList.add(new Point(x+1,y));        
          examList.add(new Point(x,y-1));  
          examList.add(new Point(x,y+1));       
        }
      }
    }

应该在哪里放置启动计时器?

1 个答案:

答案 0 :(得分:3)

基本上,您需要一些方法可以等待指定的时间段然后执行更新。

在像Swing这样的GUI框架中工作时,你不能只是在UI线程上睡觉,因为这会阻止UI线程使屏幕保持最新。同样,在该方法存在之前,UI线程也不能处理绘制请求。

如果没有更多的背景,你可以做点什么&#34;喜欢&#34; ...

public static void floodFill(final BufferedImage image, int x, int y, final int fillColor) {
    final java.util.ArrayList<Point> examList = new java.util.ArrayList<Point>();

    final int initialColor = image.getRGB(x, y);
    examList.add(new Point(x, y));

    Timer timer = new Timer(40, new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            if (!examList.isEmpty()) {
                Point p = examList.remove(0);  // get and remove the first point in the list
                if (image.getRGB(p.x, p.y) == initialColor) {
                    int x = p.x;
                    int y = p.y;
                    image.setRGB(x, y, fillColor);  // fill current pixel

                    examList.add(new Point(x - 1, y));
                    examList.add(new Point(x + 1, y));
                    examList.add(new Point(x, y - 1));
                    examList.add(new Point(x, y + 1));

                }
                repaint(); // Assuming your painting the results to the screen
            } else {
                ((Timer)e.getSource()).stop();
            }
        }
    });
    timer.start();
}

使用javax.swing.Timer来安排重复回调(在本例中,每40毫秒),处理列表中的下一个元素,这实际上是一种延迟循环

有关详细信息,请参阅How to use Swing Timers