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

Jak odświeżać paintComponent po każdej zmianie obrazka?
LU
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 127
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:

Kopiuj
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:

Kopiuj
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;
LU
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 127
0

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

Kopiuj
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.

bogdans
  • Rejestracja: dni
  • Ostatnio: dni
0

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

Kopiuj
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");
LU
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 127
0

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

Kopiuj
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?

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.