Aplikacja Swing - animacja wykorzystująca wątki

0

Zadanie jest takie, że mam stworzyć aplikacje Swing która rysuje powiększające się kwadraty, rozmiary, kolory są losowane, jSlider to czas aktywności kwadratu, czas życia każdego kwadratu jest wyświetlany w środku kwadratu. Zadanie jest takie, że muszę dodatkowo zatrzymać i rozpocząć "animację", na podstawie instrukcji z laboratorium nie mam pojęcia jak zrobić by wznowić animację.
Szukałem na ten temat, ale nie potrafię sobie z tym poradzić. Próbowałem metodą start() ale to chyba nie o to chodzi lub nie jest użyte we właściwym miejscu. Przycisk stop działa, ale gdy dla kwadratów wywołuje stop() ta funkcja jest przekreślona i też nie wiem dlaczego tak jest. Bardzo prosiłbym o jakieś wskazówki. Temat przewodni zadania to ogólnie zastosowanie wątków.

 public class Łukasz extends javax.swing.JFrame implements MouseListener {

     PanelGraficzny panel = new PanelGraficzny();
     List<Kwadrat> kwadraty = new ArrayList<Kwadrat>();
     int dt;

     public Łukasz() {
          initComponents();
          setSize(700, 600);
          panel.setBounds(50, 70, 500, 400);
          panel.setBorder(BorderFactory.createLineBorder(Color.black));
          addMouseListener(this);
          dt = jSlider1.getValue();
          add(panel);
     }

     @Override
     public void mouseClicked(MouseEvent me) {
     }

     @Override
     public void mousePressed(MouseEvent me) {
          Kwadrat kw = new Kwadrat(dt, me.getX(), me.getY());
          kwadraty.add(kw);
          kw.start();
          
     }

     @Override
     public void mouseReleased(MouseEvent me) {
     }

     @Override
     public void mouseEntered(MouseEvent me) {
     }

     @Override
     public void mouseExited(MouseEvent me) {
     }

     class PanelGraficzny extends JPanel {

          public void paintComponent(Graphics g) {
               //dt = jSlider1.getValue();
               
               // jTextField1.setText("" + dt);
               g.setColor(Color.orange);
               g.fillRect(0, 0, getWidth(), getHeight());

               for (Kwadrat a : kwadraty) {
                    a.rysuj(g);
               }

               try {
                    Thread.sleep(100);
               } catch (InterruptedException e) {
               }
               repaint();
          }
     }
                            

     private void jRadioButton2ActionPerformed(java.awt.event.ActionEvent evt) {                                              
         for(Kwadrat a : kwadraty){
              a.stop();
         }
     }                                             

     private void jSlider1MouseDragged(java.awt.event.MouseEvent evt) {                                      
          dt = jSlider1.getValue();
     }                                     

     private void jRadioButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                              
       
     }           
public class Kwadrat extends Thread {

     Łukasz a = new Łukasz();

     int wspX, wspY;
     Random rand = new Random();
     int bok;
     Color k;
     String czas;
     int dt1;
     int bok1;

     public Kwadrat(int dt, int wspX, int wspY) {
          bok = rand.nextInt(61) + 30;
          this.wspX = wspX;
          this.wspY = wspY;
          k = new Color(rand.nextInt(255), rand.nextInt(255), rand.nextInt(255));
          dt1 = dt;

     }

     public void rysuj(Graphics g) {
          czas = Integer.toString(dt1);
          g.setColor(k);
          g.fillRect(wspX - bok, wspY - bok, bok, bok);
          g.setColor(Color.black);
          g.drawString(czas, wspX - bok / 2, wspY - bok / 2);
     }

     public void run() {
          do {
               bok += 0.1 * bok;
               dt1--;
               try {
                    Thread.sleep(1000);
               } catch (InterruptedException e) {
               }
          } while (dt1 > 0);

     }
}

Nie dodałem tego kodu, który jest generowany przez NetBeansa.
Pozdrawiam

0

Używanie metody stop() nie powinno mieć miejsca, została ona zastąpiona metodą interrupt(), bo stop zabija wątek w "hamski" sposób, poniżej masz artykuł.
https://www.securecoding.cert.org/confluence/display/java/THI05-J.+Do+not+use+Thread.stop()+to+terminate+threads

Do zastopowania pracy wątku, by wątek nadal działał i rozpoczął prace możesz użyć zmiennej boolean, która będzie true, jak ma wątek pracować, a będzie operacje zatrzymywać przy false, która to będzie w metodzie publicznej tego wątka np. stwórz własną metodę stop ;)

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