使用JFrame的图像幻灯片

时间:2018-05-20 13:10:11

标签: java multithreading image swing

我的任务似乎很容易出问题。我必须创建一个程序,连续显示图像(.jpg,.png和.gif)。图像必须是某些文件的内容,这些文件作为程序的参数给出。当我必须单独加载图像时,它可以工作,但是当我在它们之间睡眠时一个接一个地加载它们时会出现问题。
这是我的代码:

  import javax.swing.SwingUtilities;

    public class Main {

      public static void main(String[] args) 
      {
        SwingUtilities.invokeLater(new Runnable() 
        {
          @Override
          public void run()  
          {
            new MyFrame(args[0],Integer.parseInt(args[1])); 
    //First argument is path to file with images, second - amount of time (in seconds) which every image has to stay on the screen until the next one appears
          }
        });
      }
    }


import java.io.File;
import javax.swing.*;

public class MyFrame extends JFrame{

    public MyFrame(String path, int time){
        super("Obrazki");
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
        this.setVisible(true);
        MyPanel panel = new MyPanel();
        panel.setVisible(true);
        this.add(panel);
        pack();
        File file = new File(path);
        String[] tabs = file.list();
        for(int i=0; i<tabs.length; i++)
        {
            panel.loadImage(path+"\\"+tabs[i]);
            this.repaint();
            try {
                Thread.sleep(time*1000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
}


import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.MediaTracker;
import java.awt.Toolkit;
import javax.swing.JPanel;

public class MyPanel extends JPanel 
{
  Image img;

  public void loadImage(String s)
  {
     img = Toolkit.getDefaultToolkit().getImage(s);
     MediaTracker tracker = new MediaTracker(this);
     tracker.addImage(img, 1);
     while(!tracker.checkID(1)) {
         try {
            tracker.waitForID(1);
         } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
         }
     }
     this.repaint();
  }

  @Override
  public void paintComponent(Graphics g) 
  {
     super.paintComponent(g);
     Graphics2D g2 = (Graphics2D)g;
     g2.drawImage(this.img, 0, 0, this.getSize().width, this.getSize().height, this);
  }
}

1 个答案:

答案 0 :(得分:1)

  

但问题是当我一个接一个地加载它们之间的睡眠时间时。

您导致Event Dispatch Thread (EDT)进入睡眠状态,这意味着GUI无法响应事件或重新绘制自身。有关详细信息,请阅读Concurrency上的Swing教程中的部分。

EDT上执行代码时,不要使用Thread.sleep()。

对于动画,你可以:

  1. 使用SwingWorker(使用Thread.sleep())并发布您想要绘制的图标,或
  2. 使用Swing Timer。本教程还有一个关于How to Use Swing Timers
  3. 的部分