Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème avec les threads...

    12 octobre 2008 à 15:44:18

    Bonjour,
    j'ai un petit programme à faire pour l'école mais jai toujours pas réussi à le faire.

    Dans ce programme, il faut que après un click sur un bouton, le cercle augmente d'une entité de sa valeur RGB après 1 seconde et quelle diminue 2% de son rayon après 2 secondes. Après que le cercle soit disparue, l'animation peut être redémarré.

    Je comprends pas tellement comment je dois utiliser les threads. Est-ce que je dois l'utiliser une seule fois après avoir cliquer sur Start ou est-ce que je dois l'utiliser plusieurs fois pour l'animation??

    Merci en avance

    cordialement,
    xcelent88
    • Partager sur Facebook
    • Partager sur Twitter
      12 octobre 2008 à 16:46:28

      tu fais un truc du genre

      quand tu clique sur un bouton :
      public void actionPerformed(ActionEvent e){
      		(new Thread(){
      		public void run() {
      			try {
      				Thread.sleep(1000); // on attend 1 sec
      			} catch (InterruptedException e) {
      				e.printStackTrace();
      			}
      		        changeCouleur1();
      			try {
      				Thread.sleep(2000); // on attend 2 sec
      			} catch (InterruptedException e) {
      				e.printStackTrace();
      			}
      		        changeCouleur2();
      		}}).start();		
      	}
      


      EDIT : si je crée chaque fois un Thread différent, c'est pour le cas où tu clique deux fois en moins de trois secondes, dans ce cas les deux threads crées fonctionnerons en même temps
      • Partager sur Facebook
      • Partager sur Twitter
        12 octobre 2008 à 18:15:18

        Salut,

        d'abord merci pour avoir essayer de répondre à mon problème. Mais j'ai toujours pas compris si je dois utiliser des threads ou qu'1 seule. J'ai essayé avec 1 seule mais je n'arrive pas à atteindre le rayon 0, car le thread meurt après un certain temps. En utilisant plusieurs threads, j'arrive au résultat souhaité pour les rayons, mais en ce qui concerne sa couleur, après que le Bleu ait atteint p.ex 255, la couleur Rouge et Verte cesse d'augmenter d'une entité. Je n'arrive pas à trouver comment je peux remedier à ce problème et en ce qui concerne les threads, je ne sais pas si ce que je fait est juste.

        Voici les codes:

        Main.java
        public class Main {
                public static void main(String args[]) { 
                        MainFrame frame = new MainFrame();
                        frame.setVisible(true);        
                 }       
        }
        


        MainFrame
        public class MainFrame extends javax.swing.JFrame {
        
            public MainFrame() {
                initComponents();
                setLocationRelativeTo(null);
                setTitle("Homework3");
            }
        
            /** This method is called from within the constructor to
             * initialize the form.
             * WARNING: Do NOT modify this code. The content of this method is
             * always regenerated by the Form Editor.
             */
            @SuppressWarnings("unchecked")
            // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
            private void initComponents() {
        ...
            }// </editor-fold>                        
        
        private void CloseButtonActionPerformed(java.awt.event.ActionEvent evt) {                                            
            System.exit(0);
        }                                           
        
        private int rad = 100;
        private int plus = 0;
        
        private void StartButtonActionPerformed(java.awt.event.ActionEvent evt) {                                            
            do{
            DrawThread t = new DrawThread(CirclePanel,rad,plus);
            t.start();
            System.out.println("Thread is ready");
            while( t.isAlive() ) {
                System.out.println("Thread is still alive");
                try {
                    Thread.sleep(1000);
                }
                catch (InterruptedException ex) {}
            }
            System.out.println("Thread is dead"); 
            plus = plus + 1;
            rad = rad - 2;
            }while (rad >= 0) ;
        }                                           
        
            // Variables declaration - do not modify                     
            private javax.swing.JPanel ButtonPanel;
            private javax.swing.JPanel CirclePanel;
            private javax.swing.JButton CloseButton;
            private javax.swing.JButton StartButton;
            // End of variables declaration                   
        
        }
        


        DrawThread.java
        import java.awt.*;
        import javax.swing.JPanel;
        
        public class DrawThread  extends Thread {
               private JPanel box;
               private int x;
               private int y;
               private int width ;
               private int height;
               private int radius;
               private int Red = 110;
               private int Green = 130;
               private int Blue = 210;
               Color c;
               private int in;
               
               
               public DrawThread(JPanel b,int radi,int plu) {
                   box = b;
                   radius = radi;
                   in = plu;
               }
               public void draw() {
                   Red = Red + in;
                   Green = Green + in;
                   Blue = Blue + in;
                   c = new Color(Red, Green, Blue); //RGB Color
                   x = box.getWidth()/4; 
                   y = 10;
                   width = radius * 2;
                   height = radius * 2;
                   Graphics g = box.getGraphics();
                   g.setColor(c);
                   g.fillOval(x, y, width, height);
                 
               }
        
               public void run(){
                   System.out.println("Thread executed");           
                   try{
                       System.out.println("Circle changes his colors");
                       Thread.sleep(1000);
                       draw();
                       in=in+1;
                   }    
                   catch(Exception e) {}
                   try{
                       System.out.println("Radius is increased");
                       Thread.sleep(2000);
                       draw();
                       radius = radius - 2;
                   }
                   catch(Exception e) {}  
                   System.out.println("Thread will finish..");
               }
        
        }
        
        • Partager sur Facebook
        • Partager sur Twitter
          12 octobre 2008 à 20:14:45

          J'ai pas lu tout ton code, mais voilà quelques pistes de recherche :

          Tu fais tout le temps des Thread.sleep(n) donc le Thread "dors" de manière forcée pendant n milli-secondes et exécute après les instructions pour mourir au final.

          Soit tu fais autant de Thread que l'utilisateur clique sur le bouton, cad tu crées un Thread dans la méthode ActionPerformed,

          Soit tu crées un unique Thread que tu endors dès le début avec la méthode wait et que tu réveilles à chaque clic avec la méthode notify.
          • Partager sur Facebook
          • Partager sur Twitter
            13 octobre 2008 à 17:04:47

            En fait, il faut que je clique q'une seule fois sur le bouton, après ça enclenche l'animation, c-à-d le cercle diminue son rayon de 2% tout les deux secondes jusqu'à ce qu'il disparaisse :euh:
            • Partager sur Facebook
            • Partager sur Twitter
              13 octobre 2008 à 18:55:29

              Sorry j'ai été trop vite j'ai pas fais attention...

              En fait tu veux que ton thread se répère jusqu'à ce que ton cercle soit de rayon nul.

              pour ce genre de cas il existe une classe javax.swing.Timer toute désignée

              final Timer t; // on déclare le timer final afin de pouvoir y accéder
              				// depuis l'intérrieur de notre ActionListener
              ActionListener listener = new ActionListener() {
              
              	public void actionPerformed(ActionEvent arg0) {
              		try {
              			Thread.sleep(1000); // on attend 1 sec
              		} catch (InterruptedException e) {
              			e.printStackTrace();
              		}
              		changeCouleur(); // on change la couleur
              		try {
              			Thread.sleep(2000); // on attend 2 sec
              		} catch (InterruptedException e) {
              			e.printStackTrace();
              		}
              		changeTailleCercle(); // on change la taille du cercle
              		if (getTailleCercle() < 0)
              			t.stop();
              	}
              };
              
              // on crée le timer, qui appellera la méthode actionPerformed() de
              // listener toutes les 3 secondes
              t = new Timer(3000, listener);
              
              // on ajoute un listener à ton bouton
              bouton.addActionListener(new ActionListener() {
              
              	public void actionPerformed(ActionEvent arg0) {
              		if (!t.isRunning()) // si ton timer n'est pas déja en route, on
              							// le met en route
              			t.start();
              		// tu peux ajouter
              		else
              			// si il est déjà en route et que l'on reclique sur le
              			// bouton, le timer s'arrete.
              			t.stop();
              	}
              });
              
              • Partager sur Facebook
              • Partager sur Twitter

              Problème avec les threads...

              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
              • Editeur
              • Markdown