我想要以JFrame的形式加载图像,使其看起来像是视频。
更改图像,如看起来像视频
对于我以为我会改变的图像,以便更快(20张/秒)。
,但问题是,当新的图像获取加载其显示全黑的窗口。
我不知道为什么会发生。
建议我在哪里出错了。
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Image;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JPanel;
import java.io.*;
import javax.imageio.ImageIO;
class VideoI extends JPanel {
private Image img;
private Graphics graphics;
ImageIcon icon;
VideoI(){
icon=new ImageIcon("D:\\Videos\\1.jpg");
add(icon);
}
public void paintComponent(Graphics g) {
graphics=g;
repeatImgs();
}
public void repeatImgs(){
for(int i=0;i<25;i++)
{ try{
img=ImageIO.read(new File("D:\\Videos\\"+i+".jpg"));
graphics.drawImage(img, 0, 0, null);
System.out.println(""+i);
Thread.sleep(1000);
}catch(Exception e){System.out.println(""+i+":"+e);}
}
}
}
public class Video extends JFrame
{
public static void main(String args[])
{
new Video().start();
}
public void start()
{
VideoI panel = new VideoI();
add(panel);
setVisible(true);
setSize(1300,800);
setDefaultCloseOperation(EXIT_ON_CLOSE);
}
}
1)不要阻塞EDT(Event Dispatch Thread) - 当发生这种情况时GUI将“冻结”。而不是调用'Thread.sleep(n)'实现一个Swing'Timer'来重复执行任务,或者一个'SwingWorker'执行长时间运行的任务。有关更多详细信息,请参见[Swing中的并发](http://docs.oracle.com/javase/tutorial/uiswing/concurrency/)。 2)不要试图加载循环中的图像。 3)'graphics.drawImage(img,0,0,null);'应该是'graphics.drawImage(img,0,0,this);'4)对代码块使用一致的逻辑缩进。代码的缩进旨在帮助人们理解流程。 –
对不起,因为我写错了代码。
我没有得到你的第二点。你能建议我可以做什么,而不是使用for循环? –
对点2的修复基本上是在构造函数中加载图像,并简单地将它们保存在数组或类似结构中。 –