Przejścia między zdjęciami w Javie

0

Cześć,
Mam do zrobienia program, który wczytane pliki będzie wyświetlał jako pokaz slajdów, zmiana ma być co określoną ilość sekund. Pliki sobie wgrałem, wszystkie mogę osobno uruchomić tyle, że nie potrafię zrobić przejść pomiędzy zdjęciami. Czy Swing jest tutaj odpowiedni? Jakie rozwiązanie pozwoli mi na coś takiego? Po każdym zaktualizowaniu obrazka powinienem użyć funkcji repaint? Bardzo proszę o jakieś podpowiedzi.
Pozdrawiam.

0

Swing się nada, do zmiany obrazka użyj Timera, repaint() jest oczywiste.

0

@bogdans
Dziękuję za odpowiedź. Zrobiłem coś takiego:

package zad2;

import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;

import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;

public class Programmers {
	public static void main(String args[]) {
		int time = Integer.parseInt(args[1]) * 1000;
		new Gallery(time);
	}
}

class Gallery extends JPanel {

	ArrayList<String> al = new ArrayList<String>();
	BufferedImage image;
	Timer tm;
	int time;

	public Gallery(int time) {
		
		JFrame f = new JFrame();
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		f.setVisible(true);
		f.setSize(500, 500);
		this.time = time;

		tm = new Timer(2000, new ActionListener() {

			public void actionPerformed(ActionEvent e) {
				for (int i = 0; i < al.size(); i++) {
					try {
						newest(i);
					} catch (IOException e1) {
						e1.printStackTrace();
					}
					repaint();
				}
				System.out.println("Koniec prezentacji");
			}
		});


		f.add(this);
		tm.start();
	}

	public void newest(int a) throws IOException {
		image = ImageIO.read(new File(al.get(a)));
	}

	public void paintComponent(Graphics g) {
		super.paintComponent(g);
		g.drawImage(image, 0, 0, getWidth(), getHeight(), this);
	}
}

W liscie al znajdują się ścieżki moich plików. Problem polega na tym, że pierwsze zdjęcie nie pojawia się automatycznie lecz po poruszeniu rozmiarem okna. Dodatkowo po poruszeniu pojawia się tylko jedno zdjęcie - ostatnie i zapętlony jest napis na konsoli "Koniec prezentacji". Czy dobrze do tego się zabieram?

0
  1. Za wcześnie wywołujesz setVisible(true) - powinno być po dodaniu pierwszego zdjęcia. Zauważ, że pierwsze zdjęcie dodajesz po 2 sekundach.
tm = new Timer(time, new ActionListener() {
...
tm.setInitialDelay(0);
  1. Źle napisałeś timer
        tm = new Timer(2000, new ActionListener() {
 
            public void actionPerformed(ActionEvent e) {
                    try {
                        newest(i);
                        i++;
                    } catch (IOException e1) {
                        e1.printStackTrace();
                    }
                    repaint();
                }
                System.out.println("Koniec prezentacji");
            }
        });

Zmienna i niech będzie polem w klasie.

0

Dziękuję jeszcze raz.
Zrobiłem tak jak mówisz, obrazki wyświetlają się jeden za drugim lecz po ostatnim wyrzuca błędem o wyjściu poza moją listę.

Exception in thread "AWT-EventQueue-0" java.lang.IndexOutOfBoundsException: Index: 3, Size: 3
	at java.util.ArrayList.rangeCheck(Unknown Source)
	at java.util.ArrayList.get(Unknown Source)
	at zad2.Slider.newest(Rysowanie.java:63)
	at zad2.Slider$1.actionPerformed(Rysowanie.java:45)
	at javax.swing.Timer.fireActionPerformed(Unknown Source)
	at javax.swing.Timer$DoPostEvent.run(Unknown Source)
	at java.awt.event.InvocationEvent.dispatch(Unknown Source)
	at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
	at java.awt.EventQueue.access$500(Unknown Source)
	at java.awt.EventQueue$3.run(Unknown Source)
	at java.awt.EventQueue$3.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
	at java.awt.EventQueue.dispatchEvent(Unknown Source)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.run(Unknown Source)

Nie mogę wrzucić fora do Timera który ustali górną granicę dla "i" aby nie wyszła poza listę i jedynie wyświetliła, że koniec galerii?
Napisałeś, żeby widoczność okna wrzucić po dodaniu pierwszego obrazka czyli teoretycznie przed funkcją repaint w moim Timerze ale to przynajmniej u mnie nie działa.

0

Nie możesz wrzucić fora do timera. Spróbuj tak

                    try {
                        if(i<al.size()){
                            newest(i);
                            i++;
                        }
                        else{
                            image = null; 
                        }
                    } catch (IOException e1) {
                        e1.printStackTrace();
                    }
                    repaint();
                }
...
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        if(image == null){
            g.drawString("Koniec galerii",100,100);
        }
        else{ 
           g.drawImage(image, 0, 0, getWidth(), getHeight(), this);
        }
    }
0

@bogdans
W takim razie wszystko jasne, bardzo dziękuję za świetną pomoc.
Całą resztą zajmę się sam.
Jeszcze raz dziękuję.

0

Czesc, mam podobny problem.
Otóż wszystko działa, również zrobiłem to na Timerze ale natknąłem sie na problem.
Chodzi o kolejność zdjęć, chcę zrobić tak, że gdy zdjęcie będzie nullem to ma wyświetlić null a gdy wszystkie zdjęcia "przejdą" ma pojawić się koniec galerii.
Zdjęcie z folderu wrzucam do arraylisty.
Ku mojemu zdziwieniu, gdy moje nullowe zdjęcie jest pomiędzy innymi wszystko jest okej, pojawia się napis i po określonym czasie przechodzi na następne zdjęcie a gdy zdjęcie nullowe jest na samym końcu w folderze to wtedy okno "zasypia" na napisie null i za nic nie może wyświetlić sie, że jest to koniec galerii.
Czy to jakiś stały błąd? Dziwne jest, że kolejność plików miałaby tak działać na mój program, to powinno być chyba obojętne?

0

Co to znaczy, że zdjęcie jest nullem?

1 użytkowników online, w tym zalogowanych: 0, gości: 1