-2

我想在 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);

}
    }
4

3 回答 3

1

您正在将事件调度线程(UI 更新线程)发送到睡眠状态,这就是您遇到屏幕问题的原因。尝试在工作线程中加载和切换图像(查看SwingWorkerJavaDoc)。

于 2013-07-24T11:48:47.990 回答
1

我不是 Swing 期望的,但我猜这是因为你用Thread.sleep. 您应该在摆动线程之外进行图像更改和计时,并用于SwingUtilities.invokeLater绘制图像。此外,您需要睡眠 50 毫秒,而不是 20 帧每秒。使用适合这里的ScheduledExecutorService 。

此外,当需要渲染图像时,您总是从光盘加载图像。这可能会变慢。最好在启动时加载所有图像,然后更改图像。

于 2013-07-24T11:49:27.983 回答
1

您正在阻塞事件调度线程。使用摇摆定时器以所需的频率重新绘制组件。

你永远不应该sleep()在美国东部时间。你想要的本质上是

public void paintComponent(Graphics g) {
    // No loops or delays, just fetch the next image, preferrably it has been
    // already been loaded by another thread.
    g.drawImage(getNextImage(), 0, 0, null);
}

还有一个定时器任务:

ActionListener timerTask = new ActionListener() {
    @Override
    public void actionPerformed(final ActionEvent e) {
        panel.repaint();
    }
};

Timer timer = new Timer(50, timerTask);

当您想开始播放视频时,只需调用timer.start()

最后,您还应该使用SwingUtilities.invokeLater().

于 2013-07-24T11:50:06.560 回答