Java 程序冻结…使用定时器设置循环中的延迟

Java 程序冻结…使用定时器设置循环中的延迟,java,image,image-processing,timer,freeze,Java,Image,Image Processing,Timer,Freeze,该方法旨在将JFrame上显示的图像逐渐更改为另一图像。然而,没有任何方法来减缓它,它似乎只是从一个图像变为一个新的图像。为了让它慢下来,我加入了一个Thread.sleep(1000),这样变化就不会立即发生。然而,有了这一行,我的程序完全冻结了。然后我试着放入一个计时器,如下所示,但程序在运行时没有显示任何变化。它仍然冻结在同一点上。谁能帮帮我吗?建议一个更好的方法来减缓它,或者如何解决这个问题 澄清一下:int k是变化中的渐进步骤数。k=1将是一个瞬间的变化。任何更大的变化都是渐进的。i

该方法旨在将JFrame上显示的图像逐渐更改为另一图像。然而,没有任何方法来减缓它,它似乎只是从一个图像变为一个新的图像。为了让它慢下来,我加入了一个Thread.sleep(1000),这样变化就不会立即发生。然而,有了这一行,我的程序完全冻结了。然后我试着放入一个计时器,如下所示,但程序在运行时没有显示任何变化。它仍然冻结在同一点上。谁能帮帮我吗?建议一个更好的方法来减缓它,或者如何解决这个问题

澄清一下:int k是变化中的渐进步骤数。k=1将是一个瞬间的变化。任何更大的变化都是渐进的。int l同时控制每个图像的显示比例

public void morphImg(int width, int height, BufferedImage morphImage, int k) {
    //creates new image from two images of same size
    final BufferedImage image2 = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
    for (int l = 1; l <= k; l++) {
        for (int i = 0; i < width; i++) {
            for (int j = 0; j < height; j++) {
                //get color from original image
                Color c = new Color(image.getRGB(i, j));

                //get colors from morph image
                Color c2 = new Color(morphImage.getRGB(i, j));

                //gets colors at different stages
                int r = ((k-l)*c.getRed()/k) + (l*c2.getRed()/k);
                int g = ((k-l)*c.getGreen()/k) + (l*c2.getGreen()/k);
                int b = ((k-l)*c.getBlue()/k) + (l*c2.getBlue()/k);   
                Color newColor = new Color(r, g, b);

                //set colors of new image to average of the two images
                image2.setRGB(i, j, newColor.getRGB());
                //display new image

                imageLabel.setIcon(new ImageIcon(image2));
                final Timer t = new Timer(500,null);
                t.setInitialDelay(500);
                t.start();
            }
        }
    }

    //sets modified image as "original" for further manipulation
    setImage(image2);
}
public void morphImg(int-width、int-height、buffereImage-morphImage、int-k){
//从两个大小相同的图像创建新图像
最终BuffereImage 2=新的BuffereImage(宽度、高度、BuffereImage.TYPE_INT_RGB);

对于(int l=1;l您当前正在为循环的每个迭代创建一个计时器,但仍然一次执行所有迭代。相反,您应该:

  • 编写一个类,让侦听器附加到计时器
  • 将当前作为局部变量获得的所有变量的状态放入侦听器类中,并使
    actionPerformed
    方法有效地执行循环的单个迭代
  • 创建该侦听器类的实例
  • 创建一个以侦听器作为唯一初始侦听器的计时器
  • 在每个计时器“勾选”时,将调用(在UI线程上)执行的
    actionPerformed
    ,您将运行循环的单个迭代,UI将更新
代码看起来有点难看,因为基本上你必须手工为
for
循环编写代码-增量
j
,如果现在等于
高度
,则将其设置为0和增量
i
;如果现在等于
宽度
,则将其设置为0和增量
l
;如果现在是gr低于
k
然后停止计时器


有关详细信息。

您创建了一个计时器,但没有告诉它做任何事情。您认为该计时器真正会做什么?您也会说“没有用”,但没有指定自将该代码放置到位后观察到的内容。@JonSkeet By“没有用”,我的意思是说什么都没有改变。程序仍然冻结,方式与线程运行时大致相同。sleep()线路就在那里。至于计时器,我对如何正确实现它非常模糊……我希望得到帮助:/啊,那更好。你没有指出从哪个位置没有任何变化。我怀疑它冻结了,因为你在很短的时间内创建了大量计时器。