Слайд-шоу изображений с использованием JFrame - PullRequest
0 голосов
/ 20 мая 2018

У меня проблема с задачей, которая казалась довольно простой.Я должен создать программу, которая будет показывать изображения (.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 голосов
/ 20 мая 2018

, но проблема в том, что я загружаю их один за другим со временем ожидания между ними.

Вы заставляете Event Dispatch Thread (EDT) спать, что означает, что графический интерфейс не может отвечатьк событиям или перекрасить себя.Прочитайте раздел из учебника Swing по Concurrency для получения дополнительной информации.

Не используйте Thread.sleep () при выполнении кода на EDT.

Для анимации вы можете:

  1. использовать SwingWorker (с Thread.sleep ()) и опубликовать значок, который вы хотите нарисовать, или
  2. использовать таймер Swing.Учебник также имеет раздел на How to Use Swing Timers.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...