Wait, sleep w Java Swing (netbeans)

0

Witam,
chciałbym utworzyć kod programu, który wywołany zostaje przyciskiem w oknie JFrame. Dodałem tam przycisk, netbeans utworzył kod odpowiadający za wywołanie akcji po użyciu przycisku i teraz: chciałbym aby w pętli do while, występowała operacja pobrania i przypisania obrazu do jakiegoś tam labela, następnie po upływie jakiegoś tam czasu do tego labela został pobrany i przypisany inny obrazek. I tak kilka razy.

W momencie używania Thread.sleep() nawet jeśli przed sleepem mam pobranie obrazka do labela program nic nie robi przez czas (suma wszystkich slepeów), i na koniec w labela wrzuca obraz z ostatniej linii wywołującej go.
Przy Wait() nie dzieje się nic.
Bez tego, obrazy ładują się ok, natomiast chcę żeby się zmieniały w odpowiednich interwałach czasowych.

Tak mniej więcej, błędów żadnych nie ma składniowych, zła metoda i nie wiem jak to ugryźć.

void Naciśnięty przycisk(){;
 label1.pobranie.przypisanie.1jpg;
try{
Thread.sleep(2000);
}catch (InterruptedException ex)
 label1.pobranie.przypisanie.2jpg;
.
.
}
1

Musisz tą całą akcje odpalić w osobnym wątku, bo inaczej blokujesz wątek UI ;]

0

Poskładałem coś takiego, jednak po uruchomieniu i użyciu przycisku start, program się zawiesza. Prawdopodobnie śpi, ale nie wiem dlaczego, skoro thread.sleep jest w osobnym wątku.
Czy jestem bliżej rozwiązania?

 package swiatla;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.Timer;


public class Sygnalizacja_v3 extends javax.swing.JFrame implements ActionListener {

    int k=0, c=0;
 Timer timer; 
 
    public Sygnalizacja_v3() {
        this.timer = new Timer(c, (ActionEvent evt) -> {
            timer.setDelay(1500);
            try{
                 s1.setIcon(new javax.swing.ImageIcon(getClass().getResource("/swiatla/Zielone.jpg")));
                s2.setIcon(new javax.swing.ImageIcon(getClass().getResource("/swiatla/Czerwone.jpg")));
                Thread.sleep(11000);
            }
            catch(InterruptedException e){
                System.out.println("thread 1 interrupted");
            }
                                  try{
                s2.setIcon(new javax.swing.ImageIcon(getClass().getResource("/swiatla/Pomaranczowe.jpg")));
                Thread.sleep(1500);
            }
            catch(InterruptedException e){
                System.out.println("thread 2 interrupted");
            }
            try{
                s1.setIcon(new javax.swing.ImageIcon(getClass().getResource("/swiatla/Czerpom.jpg")));
                Thread.sleep(4500);
            }
            catch(InterruptedException e){
                System.out.println("thread 3 interrupted");
            }
                s2.setIcon(new javax.swing.ImageIcon(getClass().getResource("/swiatla/Czerwone.jpg")));

        });
        initComponents();
    }
   
.
.
.

    private void startActionPerformed(java.awt.event.ActionEvent evt) {                                      
        if(k==0){
        timer.start()  ;
        k++;
        }
    }                                     

    private void stopActionPerformed(java.awt.event.ActionEvent evt) {                                     
       timer.stop();
        k = 0;
        s1.setIcon(new javax.swing.ImageIcon(getClass().getResource("/swiatla/Nic.jpg")));
        s2.setIcon(new javax.swing.ImageIcon(getClass().getResource("/swiatla/Nic.jpg"))); 
    }                                    

    public static void main(String args[]) {
     
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(Sygnalizacja_v3.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(Sygnalizacja_v3.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(Sygnalizacja_v3.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(Sygnalizacja_v3.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        

       
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new Sygnalizacja_v3().setVisible(true);
            }
        });
    }

    // Variables declaration - do not modify                     
    private javax.swing.JPanel jPanel1;
    private javax.swing.JLabel s1;
    private javax.swing.JLabel s2;
    private javax.swing.JButton start;
    private javax.swing.JButton stop;
    // End of variables declaration                   

    @Override
    public void actionPerformed(ActionEvent e) {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }

  
}
1

gdzie tworzysz nowy wątek?

 public class Watek implements  Runnable{

@Override
	public void run() {
		
	}


}


public Main {

public static void main(String[] args) {
Thread watek = new Thread(new Watek());
watek.start();
}

}

0

Rzeczywiście, źle zrozumiałem co to wątek ETD. Nie tworzę.

Rozumiem zatem, że mogę użyć kodu, który podałeś albo... użyć swingworkera do utworzenia nowego wątku?
Mógłbym prosić o słowo komentarza do tego kodu, coś co pomoże mi zrozumieć jak zaimplementować to do programu?

0

podałem Ci na szybko jak się tworzy wątek w java dopasuj to do swojego "programu"

0

Ok, utworzyłem wątek. Wywołując metodę start() program wchodzi w poniższy wątek, wszystko cacy się usypia, tylko nie zmienia mi teraz obrazów, outprint wypluwa ten tekst, czyli pętla i spanko działa, natomiast jest problem z JLabelem.

 public void start(){
		if(watek==null){
			watek = new Thread(this);
			watek.start();
		}
	}

      @Override
        public void run() {
		if(watek==null){
			watek = new Thread(this);
                }
                
		while (watek==Thread.currentThread()){
                    System.out.println("leci");    
            try{
                 s1.setIcon(new javax.swing.ImageIcon(getClass().getResource("/swiatla/Zielone.jpg")));
                 s2.setIcon(new javax.swing.ImageIcon(getClass().getResource("/swiatla/Czerwone.jpg")));
                  System.out.println("leci1");
                Thread.sleep(11000);
            }
            catch(InterruptedException e){
                System.out.println("thread 1 interrupted");
            }
            try{
                s1.setIcon(new javax.swing.ImageIcon(getClass().getResource("/swiatla/Pomaranczowe.jpg")));
                 System.out.println("leci2");
                Thread.sleep(1500);
            }
            catch(InterruptedException e){
                System.out.println("thread 2 interrupted");
            }
            try{
                s2.setIcon(new javax.swing.ImageIcon(getClass().getResource("/swiatla/Czerpom.jpg")));
                 System.out.println("leci3");
                Thread.sleep(4500);
            }
            catch(InterruptedException e){
                System.out.println("thread 3 interrupted");
            }
            try{
                s1.setIcon(new javax.swing.ImageIcon(getClass().getResource("/swiatla/Czerwone.jpg")));
                 System.out.println("leci4");
                Thread.sleep(1500);
            }
            catch(InterruptedException e){
                System.out.println("thread 4 interrupted");
            }
		}	
	}

        public void stop(){
		watek=null;
	}

dalej zwyczajnie wywołuję:

   private void startActionPerformed(java.awt.event.ActionEvent evt) {                                      

    Sygnalizacja_v3 dziala = new Sygnalizacja_v3();   
    dziala.start();
    }      

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