Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 用于设置洪水填充多边形动画的摆动计时器?_Java_Swing_Animation_Graphics_Timer - Fatal编程技术网

Java 用于设置洪水填充多边形动画的摆动计时器?

Java 用于设置洪水填充多边形动画的摆动计时器?,java,swing,animation,graphics,timer,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<

我有一个算法,我已经实现,以填补任何形状。。。。但它立即填充形状,没有任何延迟。。。我想让它显示一种动画,这样当一个形状被填充时,可以看到泛洪填充算法是如何工作的

这是我的算法:

  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));       
        }
      }
    }
publicstaticvoidfloodfill(buffereImage图像、intx、inty、intfillcolor)
{
java.util.ArrayList examList=new java.util.ArrayList();
int initialColor=image.getRGB(x,y);
添加(新点(x,y));
而(examList.size()>0)
{
点p=examList.remove(0);//获取并删除列表中的第一个点
if(image.getRGB(p.x,p.y)==initialColor)
{
x=p.x;y=p.y;
image.setRGB(x,y,fillColor);//填充当前像素
增加(新点(x-1,y));
examList.add(新点(x+1,y));
增加(新点(x,y-1));
examList.add(新点(x,y+1));
}
}
}

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

基本上,您需要某种方法来等待指定的时间段,然后执行更新

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

没有更多的上下文,你可以做一些“像”

publicstaticvoidfloodfill(最终缓冲区图像,int x,int y,最终int fillColor){
final java.util.ArrayList examList=new java.util.ArrayList();
最终int initialColor=image.getRGB(x,y);
添加(新点(x,y));
计时器计时器=新计时器(40,新ActionListener(){
@凌驾
已执行的公共无效操作(操作事件e){
如果(!examList.isEmpty()){
点p=examList.remove(0);//获取并删除列表中的第一个点
if(image.getRGB(p.x,p.y)==initialColor){
int x=p.x;
int y=p.y;
image.setRGB(x,y,fillColor);//填充当前像素
增加(新点(x-1,y));
examList.add(新点(x+1,y));
增加(新点(x,y-1));
examList.add(新点(x,y+1));
}
repaint();//假设您在屏幕上绘制结果
}否则{
((计时器)e.getSource()).stop();
}
}
});
timer.start();
}
它使用
javax.swing.Timer
来安排一次重复的回调(在本例中,每40毫秒一次),处理列表中的下一个元素,这实际上是一种延迟循环


有关更多详细信息,请参见。基本上,您需要某种方法来等待指定的时间段,然后执行更新

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

没有更多的上下文,你可以做一些“像”

publicstaticvoidfloodfill(最终缓冲区图像,int x,int y,最终int fillColor){
final java.util.ArrayList examList=new java.util.ArrayList();
最终int initialColor=image.getRGB(x,y);
添加(新点(x,y));
计时器计时器=新计时器(40,新ActionListener(){
@凌驾
已执行的公共无效操作(操作事件e){
如果(!examList.isEmpty()){
点p=examList.remove(0);//获取并删除列表中的第一个点
if(image.getRGB(p.x,p.y)==initialColor){
int x=p.x;
int y=p.y;
image.setRGB(x,y,fillColor);//填充当前像素
增加(新点(x-1,y));
examList.add(新点(x+1,y));
增加(新点(x,y-1));
examList.add(新点(x,y+1));
}
repaint();//假设您在屏幕上绘制结果
}否则{
((计时器)e.getSource()).stop();
}
}
});
timer.start();
}
它使用
javax.swing.Timer
来安排一次重复的回调(在本例中,每40毫秒一次),处理列表中的下一个元素,这实际上是一种延迟循环


有关更多详细信息,请参见。基本上,您需要某种方法来等待指定的时间段,然后执行更新

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

没有更多的上下文,你可以做一些“像”

publicstaticvoidfloodfill(最终缓冲区图像,int x,int y,最终int fillColor){
final java.util.ArrayList examList=new java.util.ArrayList();
最终int initialColor=image.getRGB(x,y);
添加(新点(x,y));
计时器计时器=新计时器(40,新ActionListener(){
@凌驾
已执行的公共无效操作(操作事件e){
如果(!examList.isEmpty()){
点p=examList.remove(0);//获取并删除列表中的第一个点
if(image.getRGB(p.x,p.y)==initialColor){
int x=p.x;
int y=p.y;
image.setRGB(x,y,fillColor);//填充当前像素
增加(新点(x-1,y));
考官
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();
}