Jak odświeżyc okno JFrame

0

Witam
Dopiero zaczynam swoja przygode z GUi i mam pewien problem chciałbym zrobic krótki
pokaz slajdów tak aby program otwierał kolejne zdjecia z katalogu i wszystko działa dobrze
tylko kolejne zdjecia nakladaja sie na siebie i nie wiem jak odswieżyc zawartosc okna i jego rozmiar.
Oczywiscie jest to tylko fragment programu w pełnym wszystko odbywa sie w podklasach z opóznieniami miedzy kolejnymi zdjeciami.

public class Zad {
    public static void main(String[] args) throws IOException {
Image image = null;
File file = new File("c:\\pic");

JFrame frame = new JFrame();

for( File imgFile :file.listFiles()){
            image = ImageIO.read(imgFile);
JLabel label = new JLabel(new ImageIcon(image));
        //JFrame frame = new JFrame();
        frame.getContentPane().add(label, BorderLayout.CENTER);
        frame.pack();
        frame.setVisible(true);

           }
    }
    }

Z góry dzieki za pomoc

0

żeby usunąć poprzednie zapisane zdjęcia może spróbuj użyć metody remove przed tworzeniem nowego zdjęcia.

0

Ale co taka metoda miała by usuwac okno czy jego zawartosc bo kolejne zdjecia
sie pojawiaja tylko jakby pod pierwszym zdjeciem

0
drooone79 napisał(a)

Ale co taka metoda miała by usuwac okno czy jego zawartosc bo kolejne zdjecia
sie pojawiaja tylko jakby pod pierwszym zdjeciem

ogólnie ja bym inaczej "rozłożył" ten kod.

Po pierwsze w metodzie main Stworzył

  SwingUtilities.invokeLater(new Runnable() {
    public void run() {     
    }
  });

i w metodzie run wątku wrzucił obiekt Jframe'a i dodatki typu setVisible setClose..cośtam i setSize
Klasa Zad dziedziczyłaby po Jframe i to ją bym wywoływał w metodzie run.
W konstruktorze Zad znajdowałaby się konstrukcja całego okna.

Przerzucanie zdjęć zrobiłbym na zasadzie guzika i właśnie w obsłudze zdarzeń tego guzika umieściłbym metodę remove.
Umieściłeś zdjęcie w komponencię JLabel więc przed wrzuceniem zdjęcia do niego musisz usunąć poprzednie.

0

Program ma byc bez przyciskow sam poaz slajdów z jakas przerwa miedzy zdjeciami
na razie wyglada to tak.

public class Zad3 {

    public static void main(String[] args) throws IOException {

        String path ="c:\\pic";
        Thread th1 = new Thread ( new Showhold(path ,2));
                          th1.start();
    }
    }

class Showhold implements Runnable{

private String path;
private long hold;

public Showhold (String path,long hold){
    this.path=path;
    this.hold=hold*1000;
}
public void run() {
    Image image = null;
    File file = new File(path);
    JFrame frame = new JFrame();
            for (File imgFile : file.listFiles()) {
            try {
                image = ImageIO.read(imgFile);
            } catch (IOException e) {               
                e.printStackTrace();
            }

      JLabel label = new JLabel(new ImageIcon(image));

        frame.getContentPane().add(label, BorderLayout.CENTER);
        frame.pack();
        frame.setVisible(true);             
        try {
              Thread.sleep(hold);
            } catch(InterruptedException exc) {
            }           

}}} 

Niestety nadal zdjecia sie nakladaja
Wpadłem na pomysł ze mogłbym ewentualnie po "Thread.sleep" okno zamykac i nowe otwierac w petli
ale pachnie to troche kombinatorstwem :)

0

Dopisz usuwanie zdjęcia

        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //tego Ci tez brakowało
        JLabel label=null;
        for (File imgFile : file.listFiles())
        {
            try
            {
                image = ImageIO.read(imgFile);
            }
            catch (IOException e)
            {
                e.printStackTrace();
            }
            if(image==null)
            {
                continue; //w wybranym katalogu mogą być pliki, które nie są obrazkami
            }
            if(label!=null)
            {
                frame.remove(label);
            }
            label = new JLabel(new ImageIcon(image));
            frame.add(label);
            frame.pack();
            frame.setVisible(true);
            try
            {
                Thread.sleep(hold);
            }
            catch(InterruptedException exc)
            {
            }
        }
0

Dzieki za podpowiedz z plikiem innym niz fotka jak najbardziej działa tylko z małym ale
przy pierwszym uruchomieniu zmienna label jest wartosci null wiec nie ma co usunac
i dostaje error na remove unknown source .
rozwiazałem to przerzucajac usuwanie label na koniec

Jak mozna by to rozwiazac za pomoca obsługi Exception ??

0

I co z tego, że label jest null w pierwszy przebiegu? Przecież kod wygląda tak:

if(label!=null)
{
   frame.remove(label);
}

Możesz zrobić tak (imho, jest to niewłaściwe stosowanie wyjątków):

try
{
   frame.remove(label);
}
catch(NullPointerException e)
{
}
0

Już sobie poradziłem z tym problemem .
A masz może pomysł jak
po wyswietleniu ostatniego zdjecia wyswietlic na ekranie napis np Koniec
chodzi mi tu bardziej o to jak ustawic warunek i jak sprawdzac ze to juz ostatni.

0

Możesz skorzystać z klasycznej pętli for

File[] pictures=file.listFiles();
for(int i=0;i<pictures.length;i++)
{
   File imgFile=pictures[i];
   .....
   if(i==pictures.length-1)
     \\informacja, że to był ostatni obrazek

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