Jak odświeżać paintComponent po każdej zmianie obrazka?

0

Mam zrobioną przeglądarkę zdjęć w javie. Próbuje zrobić jeszcze pokaz slajdów. To co napisałem zmienia obrazki ale paintcomponent odświeża się dopiero gdy skończy się pętla dlatego widać tylko pierwszy i ostatni obrazek. Nie wiem jak zrobić żeby odświeżanie było po każdej zmianie obrazka. Gdzieś czytałem że potrzebna jest obsługa wątków ale nie wiem jak to zrobić.
Panel gdzie wyświetlane są obrazki:

private class PanelDoRysowania extends JPanel 
    {
        
        public void paintComponent(Graphics g)
        {
            Image czysczenie=null;
            dimensionObrazka.height=wysObraz;
            dimensionObrazka.width=szerObraz;
            this.setSize(dimensionObrazka);
            this.setPreferredSize(dimensionObrazka);
            //System.out.println(szerObraz+" rep "+wysObraz);
            g.drawImage(czysczenie, 0, 0, null);
            g.drawImage(image, 0, 0, szerObraz, wysObraz, null);
            repaint();     
        }
    }

i action listener:

case 6:
                try
                {
                    String czasslajdu = JOptionPane.showInputDialog("Podaj czas slajdu.");
                    int czasslaj=Integer.parseInt(czasslajdu);
                    for (pol_obrazu_w_tablicy = 0; pol_obrazu_w_tablicy < pliki.length; pol_obrazu_w_tablicy++)
                        {
                            try
                            {
                                image = ImageIO.read(new File(folder_z_plikami.toString()+"\\"+pliki[pol_obrazu_w_tablicy]));
                                System.out.println("poczatek czekania");
                                Thread.sleep(czasslaj);
                                System.out.println("koniec czekania");
                            }catch (IOException ex)
                            {
                                Logger.getLogger(ImageViewer.class.getName()).log(Level.SEVERE, null, ex);
                            }catch (InterruptedException ex2)
                            {
                                System.out.println("Interrupted");
                            }
                        }
                } catch(NumberFormatException nfe)
                {
                    JOptionPane.showMessageDialog(null,
                    "czas musi byc liczba",
                    "Blad",
                    JOptionPane.ERROR_MESSAGE);
                }
                break;
0

Poczytałem jeszcze trochę o wątkach i napisałem takie coś:

package imageviewer;

import java.awt.Image;
import java.io.File;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;

/**
 *
 * @author Łukasz
 */
public class MyRun implements Runnable {
 
    private int czasslajdu;
    private Image image;
    private int polozenie_obrazu;
    private String[] pliki;
    private File folder_z_plikami;
 
    public MyRun(int czasslajdu, int pol, String[] pliki, File folder) {
        this.czasslajdu = czasslajdu;
        this.polozenie_obrazu = pol;
        this.pliki = pliki;
        this.folder_z_plikami = folder;
    }
 
    @Override
    public void run() {
        for (polozenie_obrazu = 0; polozenie_obrazu < pliki.length; polozenie_obrazu++)
                        {
                            try
                            {
                                image = ImageIO.read(new File(folder_z_plikami.toString()+"\\"+pliki[polozenie_obrazu]));
                                System.out.println("poczatek czekania");
                                Thread.sleep(czasslajdu);
                                System.out.println("koniec czekania");
                            }catch (IOException ex)
                            {
                                Logger.getLogger(ImageViewer.class.getName()).log(Level.SEVERE, null, ex);
                            }catch (InterruptedException ex2)
                            {
                                System.out.println("Interrupted");
                            }
                        }
    }
}

Czy można tu jakoś zwrócić ten obrazek który zmieniam bo muszę go odrysować na moim paintcomponent po każdej zmianie.

0

Po pierwsze, usuń z metody paintComponent() wywołanie repaint.
Po drugie, przekaż do wątku referencje do panelu z obrazkiem.

public class MyRun implements Runnable {
 
    private int czasslajdu;
    private Image image;
    private int polozenie_obrazu;
    private String[] pliki;
    private File folder_z_plikami;
    private PanelDoRysowania panel;
 
    public MyRun(int czasslajdu, int pol, String[] pliki, File folder,PanelDoRysowania panel) {
        this.czasslajdu = czasslajdu;
        this.polozenie_obrazu = pol;
        this.pliki = pliki;
        this.folder_z_plikami = folder;
        this.panel = panel;
    }
 
    @Override
    public void run() {
        for (polozenie_obrazu = 0; polozenie_obrazu < pliki.length; polozenie_obrazu++)
                        {
                            try
                            {
                                image = ImageIO.read(new File(folder_z_plikami.toString()+"\\"+pliki[polozenie_obrazu]));
                                panel.setImage(image);
                                panel.repaint();
                            System.out.println("poczatek czekania");
0

Możesz opisać to trochę bardziej szczegółowo bo już się pogubiłem? Mam to tak wywołać?

PanelDoRysowania a = new PanelDoRysowania();
a.run()

Teraz mam stworzoną klasę w oddzielnym pliku MyRun.java. Żeby zadziałało to co napisałeś kod z MyRun.java musi być w PanelDoRysowania?

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