Java 程序冻结…使用定时器设置循环中的延迟
该方法旨在将JFrame上显示的图像逐渐更改为另一图像。然而,没有任何方法来减缓它,它似乎只是从一个图像变为一个新的图像。为了让它慢下来,我加入了一个Thread.sleep(1000),这样变化就不会立即发生。然而,有了这一行,我的程序完全冻结了。然后我试着放入一个计时器,如下所示,但程序在运行时没有显示任何变化。它仍然冻结在同一点上。谁能帮帮我吗?建议一个更好的方法来减缓它,或者如何解决这个问题 澄清一下:int k是变化中的渐进步骤数。k=1将是一个瞬间的变化。任何更大的变化都是渐进的。int l同时控制每个图像的显示比例Java 程序冻结…使用定时器设置循环中的延迟,java,image,image-processing,timer,freeze,Java,Image,Image Processing,Timer,Freeze,该方法旨在将JFrame上显示的图像逐渐更改为另一图像。然而,没有任何方法来减缓它,它似乎只是从一个图像变为一个新的图像。为了让它慢下来,我加入了一个Thread.sleep(1000),这样变化就不会立即发生。然而,有了这一行,我的程序完全冻结了。然后我试着放入一个计时器,如下所示,但程序在运行时没有显示任何变化。它仍然冻结在同一点上。谁能帮帮我吗?建议一个更好的方法来减缓它,或者如何解决这个问题 澄清一下:int k是变化中的渐进步骤数。k=1将是一个瞬间的变化。任何更大的变化都是渐进的。i
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()线路就在那里。至于计时器,我对如何正确实现它非常模糊……我希望得到帮助:/啊,那更好。你没有指出从哪个位置没有任何变化。我怀疑它冻结了,因为你在很短的时间内创建了大量计时器。