Partage
  • Partager sur Facebook
  • Partager sur Twitter

quelqu un a til un exemple de pattern observer

    18 novembre 2022 à 11:25:42

    bonjour

    voila plusieurs semaines que j essaye de faire un pattern observer sur un thread;mon idée c est de faire un panel avec des bouttons pour un jeu,et d avoir un compte a rebours qui affiche le temps restant;pour cela j ai fait un thread qui ,pour l instant affiche les secondes dans la console alors que ma fenetre s affiche;pour recupere cette valeur ,j ai compris,sauf erreur qu il fallait faire un pattern observer pour renvoyer la valeur du decompte a ma fenetre a chaque fois que ca change;mais je ne trouve des exemples soit en anglais ,soit compliqués;j ai compris qu il fallait faire des interfaces observé et observateur;si quelqu un a un exemple simple a me montrer,ou il n y aurait qu un seul sujet observé et un seul observateur,peut etre que je comprendrait mieux;l exemple le plus simple que j ai trouvé c est https://www.digitalocean.com/community/tutorials/observer-design-pattern-in-java;mais je ne compends pas comment la liste des observateurs arrive a etre ecrite ,et ou elle est ;bref,peut etre mon niveau est trop faible,vu que ca fait 2 semaine que j essaye d adapter a mon projet ce que je trouve sur internet,sans y arriver;alors un exemple simple serait le bien venu (au fait ,si les programmateurs pouvaient eviter d appeler les methodes ,les classes ,les objet avec des noms similaires a une majuscule pres ce serait plus facile pour nous les amateurs)

    merci

    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      21 novembre 2022 à 22:49:11

      Bonjour,

      Est-ce que c'est le bon design pattern pour ton idée, je ne sais pas (j'ai pas le niveau pour répondre).

      Cependant, j'ai l'impression que tu butes plus sur un manque de compréhension du code et de l'exemple que du pattern en lui-même. Et donc que ce qui te manque, c'est plus des notions de programmation orientée objet et de Java que d'ingénierie logicielle. Et c'est sûr que sans une maîtrise des bases, ce sera plus complexe d'implémenter des concepts plus avancés même bien compris.

      vulcain1972 a écrit:

      l exemple le plus simple que j ai trouvé c est https://www.digitalocean.com/community/tutorials/observer-design-pattern-in-java;mais je ne compends pas comment la liste des observateurs arrive a etre ecrite ,et ou elle est

      En reprenant le même exemple:

      • la liste des observateurs est un attribut d'objet de type MyTopic.
      public class MyTopic implements Subject {
      
      	private List<Observer> observers;
      • elle est initialisé dans le constructeur:
      	public MyTopic(){
      		this.observers=new ArrayList<>();
      	}
      • la liste est modifiée (ajout ou suppression d'éléments) dans les méthodes register et unregister qui sont des méthodes de l'interface Subject à implémenter (@Override).

      Est-ce que c'est plus claire comme ça? Sinon qu'est qui ne l'est pas?

      Peux-tu nous montrer ton code et ta tentative actuelle d'intégration du pattern dans ton programme?

      • Partager sur Facebook
      • Partager sur Twitter
        22 novembre 2022 à 13:47:55

        Un simple listener fera l'affaire:

        interface TimeListener avec void onChange(DateTime newValue)

        ton composant ui implemente cette interface(en prenant soin que les changements se fassent via le thread ui)

        tu le passes a ton objet qui calcule le temps et appelle l'interface a chaque modif

        • Partager sur Facebook
        • Partager sur Twitter
          23 novembre 2022 à 19:41:34

          bonjour

          comme demandé voici ou j en suis sur mon code,qui ne marche pas;merci pxl pour ton conseil,je vais voir si j arrive a quelque chose avec qui serait plus simple;mais je vous montre d abord ce que j ai essayé;là mon probleme, c est que je voudrait recuperer l evolution de mon compteur dans la classe principale pour pouvoir l afficher dans un jlabel,mais je ne vois pas comment ajouter le main en observateur;c est peut etre pas possible d ailleurs;

          package decomptetemps;
          //voir https://docs-oracle-com.translate.goog/javase/7/docs/api/java/util/Observable.html?_x_tr_sl=en&_x_tr_tl=fr&_x_tr_hl=fr&_x_tr_pto=sc
          //et https://docs-oracle-com.translate.goog/javase/7/docs/api/java/util/Observer.html?_x_tr_sl=en&_x_tr_tl=fr&_x_tr_hl=fr&_x_tr_pto=sc
          //ou mieux https://italiancoders.it/observer-pattern/
          //voir programme java essaikeylistener
          //essai pour avoir le curseur dans jtextfield et pour effacer et remettre le jtextfield quand on veux
          import java.awt.Color;
          import java.awt.Font;
          import java.awt.event.ActionEvent;
          import java.awt.event.ActionListener;
          import java.awt.event.KeyEvent;
          import java.awt.event.KeyListener;
          
          
          
          import javax.swing.JButton;
          import javax.swing.JFrame;
          import javax.swing.JLabel;
          import javax.swing.JPanel;
          import javax.swing.JTextField;
          
          
          //voir video https://www.youtube.com/watch?v=ojbT9WA70Fw
          
          public class principal implements Observateur {
          	
          	//voir com.journaldev.design.observer
          	private static String name;
          	
          	public static  void main(String[] args){
          		
          		JTextField mot=new JTextField();
          		JPanel panel= new JPanel();
          		JButton bouton1 = new JButton("efface");
          	 Font f=new Font("Arial", Font.BOLD, 20);
          		bouton1.setFont(f);
          					  
          		bouton1.setBackground(Color.gray);
          		 bouton1.setForeground(Color.black);
          		bouton1.setBounds(20, 80, 100, 40); //positionnement du bouton en partant du coin gauche x horiz y verti v long ww larg
          		 panel.add(bouton1);
          		 JButton bouton2 = new JButton("apparait ");		
          		 Font f2=new Font("Arial", Font.BOLD, 20);
          		 bouton2.setFont(f2);
          		 			  
          		 bouton2.setBackground(Color.gray);
          		 			  
          		 bouton2.setForeground(Color.black);
          		 			  
          		 bouton2.setBounds(400,80,150, 40);  
          		 panel.add(bouton2);
          	
          		JLabel label = new JLabel("temps", JLabel.CENTER);
          		Font f14=new Font("Arial", Font.BOLD, 20);
          	    label.setFont(f14);
          		 JFrame pan = new JFrame("saisie rapide");
          		 mot.setVisible(true);
           	 pan.setAlwaysOnTop( true );//pour que la fenetre s affiche devant le reste
          	   pan.setContentPane(panel);
          	   pan.setSize(580, 400);// taille de la fenetre
          	   pan.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
          	    pan.setLocationRelativeTo(null);
          	    Font gt=new Font("Arial", Font.BOLD, 20);
          	    label.setBounds(20,200, 80, 60);
          	    
          	 
          	  	//this.compte = new compteurtemps();
          	 
          	  		
          		 mot.setFont(gt);//caractristiques case texte entree
          		mot.setBounds(250,200, 100,60);
          	   panel.setLayout(null);
          	   panel.add(label);
          	   panel.add(mot);
          	   bouton1.addActionListener(new ActionListener() {//clic sur chiffre 1
          		   public void actionPerformed(ActionEvent ae) {
          			   mot.setVisible(false);//efface la case retour "mot" quand on clic dessus
          		   }});
          	   bouton2.addActionListener(new ActionListener() {//clic sur chiffre 1
          		   public void actionPerformed(ActionEvent ae) {
          			   mot.setVisible(true);//remet la case retour "mot" quand on clic dessus
          			   mot.requestFocus();//permet d avoir le focus sur la case de rentree
          		   }});
          	
          	    KeyListener keyListener = new KeyListener() {
          		       public  void keyPressed(KeyEvent keyEvent) {
          		        printIt( "Presse" , keyEvent);
          		    	if (keyEvent.getKeyCode() == KeyEvent.VK_ENTER) {//action quand on appui sur entree
          					
          					String g=mot.getText();//recupereation de la valeur rentree
          					System.out.println("appui sur entree donne"+g);
          				}
          		      }
          
          		      public  void keyReleased(KeyEvent keyEvent) {
          		        printIt( "Released" , keyEvent);
          		      }
          
          		      public  void keyTyped(KeyEvent keyEvent) {
          		        printIt( "Typed" , keyEvent);
          		      }
          
          		      private  void printIt(String title, KeyEvent keyEvent) {
          		         int keyCode = keyEvent.getKeyCode();
          		        String keyText = KeyEvent.getKeyText(keyCode);
          		        System.out.println(title + " : " + keyText + " / " + keyEvent.getKeyChar());
          		      }
          		    } ;
          		    mot.addKeyListener(keyListener);
          	   
          	 ;
          	   pan.setVisible(true);
          	
          	   // instanciantion d'un objet de type Runnable
          	  compteurtemps alpha =  new compteurtemps() ;
          
          		 // construction d'un Thread en passant cette instance de Runnable en paramètre
          		Thread thread =  new Thread(alpha) ;
          
          		 // lancement de ce thread par appel à sa méthode start()
          		thread.start() ;}
          		 
          	//alpha.ajouterObservateur(null);}//probleme ici comment ajouter un observateur????
          	
          	   
              public void actualiser(Observable o)
              {
                      if(o instanceof compteurtemps)
                      {       
                      	compteurtemps g = (compteurtemps) o;
                              System.out.println("valeur j en retour"+g.getPosition());
                      }                     
              }
          	
          	
          }
          package decomptetemps;
          
          import java.util.ArrayList;
          import java.util.List;
          import java.util.concurrent.TimeUnit;
          
          
          
          
          
          
          
          
          
          
          
          
          
          
          
          //c est ce qui est observé par subject
          
          public class compteurtemps implements Observable, Runnable {
          	private static Object j = null;
          	private ArrayList<Observateur> tabObservateur;// Tableau d'observateurs.
          	// implémentation de la méthode run() de l'interface Runnable
          	
              public  void run() {
              	//super.run();
              	int i=0;
              	
          		for(i=1 ; i <=10; i++){
          			
          			 //System.out.println("\b\b\b\b") ;//marche pas sous eclipse pour effacer la console
          			 // System.out.println("\b") ;
          			 // System.out.println("\b") ;
          		j=i;
          		notifierObservateurs();
          		System.out.println("i="+i);
          		System.out.println("j="+j);
          		 try {
          	            TimeUnit.SECONDS.sleep(1);
          	        } catch (InterruptedException e) {
          	            e.printStackTrace();
          	        }
          	}
                   
                
                }
          	
          
          
              // Permet d'ajouter (abonner) un observateur à l'écoute 
              public void ajouterObservateur(Observateur o)
              {
                      tabObservateur.add(o); 
                     
              }
              
            
          
          
          
          	// Permet de supprimer (résilier) un observateur écoutant 
              public void supprimerObservateur(Observateur o)
              {
                      tabObservateur.remove(o);              
              }
          
          
              // Méthode permettant de notifier tous les observateurs lors d'un changement d'état 
              public void notifierObservateurs()
              {
             	 for(int i=0;i<tabObservateur.size();i++)
                  {
                          Observateur o = (Observateur) tabObservateur.get(i);
                          o.actualiser(this);// On utilise la méthode "tiré".
                  }
              }
          	
              
              public String getPosition()
              {
                      return (String) j;
              }
          	
          
          	
          	
          
          	
          
          
             }
          package decomptetemps;
          
          
          
          //Interface implémentée par toutes les classes souhaitant avoir des observateurs à leur écoute.
          public interface Observable
          {
             // Méthode permettant d'ajouter (abonner) un observateur.
             public void ajouterObservateur(Observateur o);
             // Méthode permettant de supprimer (résilier) un observateur.
             public void supprimerObservateur(Observateur o);
             // Méthode qui permet d'avertir tous les observateurs lors d'un changement d'état.
             public void notifierObservateurs();
          }
          
          package decomptetemps;
          
          
          
          //Interface implémentée par tous les observateurs.
          public interface Observateur
          {
             // Méthode appelée automatiquement lorsque l'état (position ou précision) du GPS change.
             public void actualiser(Observable o);
          }

          desolé si c est pas tres clair ou pas conforme aux bonne pratiques java,mais j essaye de faire un truc juste pour le fun,comme disent les jeunes;je suis pas du tout un pro,ca se voit je pense;le truc c est que si je recupere l evolution de ma valeur dans le principal,je pense que j arriverais avec mes connaissances actuelles a l afficher dans la fenetre;si je dois faire comme dans cet exemple qui ma inspiré https://design-patterns.fr/observateur-en-java et bien il faut faire un main et faire une classe affichage separée ,ce que je n ai pas fait;c est peut etre la solution;donnez moi vos avis et vos propositions

          merci




          • Partager sur Facebook
          • Partager sur Twitter
            24 novembre 2022 à 6:52:22

            Ton pattern observer va avoir besoin d'objets(instances de classe) or tu n'en as pas etant donne que ton code se trouve au niveau de la classe(main est static)
            • Partager sur Facebook
            • Partager sur Twitter
              30 novembre 2022 à 11:25:14

              bonjour;bon donc j ai modifié mon code comme dit par PXL ,mais je n arrive jamais a avoir de notifications;dans la classe compteurtemps,ou j ai mis des lignes pour faire des mouchards,je constate que je met bien ma classe affichage en observateur,mais quand je lance dans le main "affichage" et donc le thread de "compteurtemps",il n y a plus rien dans le tableau arraylist des observateurs;pouvez vous me dire ou est mon erreur car je ne trouve pas;comme precedement je me suis fortement inspiré de https://design-patterns.fr/observateur-en-java;voici mon code

              package decomptetempscompletpatternobser;
              
              
              
              public class Main {
              
              	public static void main(String[] args) {
                      // Création de l'objet Gps observable.
                      compteurtemps g = new compteurtemps();
                      // Création de deux observeurs AfficheResume et AfficheComplet
                      affichage ar = new affichage();
                      ar.glob();
                      // On ajoute AfficheResume comme observeur de Gps.
                      g.ajouterObservateur(ar);System.out.println("ar v"+ar+"g "+g);
                     
                      
              }
              
              }
              
              package decomptetempscompletpatternobser;
              
              //voir https://docs-oracle-com.translate.goog/javase/7/docs/api/java/util/Observable.html?_x_tr_sl=en&_x_tr_tl=fr&_x_tr_hl=fr&_x_tr_pto=sc
              //et https://docs-oracle-com.translate.goog/javase/7/docs/api/java/util/Observer.html?_x_tr_sl=en&_x_tr_tl=fr&_x_tr_hl=fr&_x_tr_pto=sc
              //ou mieux https://italiancoders.it/observer-pattern/
              //voir programme java essaikeylistener
              //essai pour avoir le curseur dans jtextfield et pour effacer et remettre le jtextfield quand on veux
              import java.awt.Color;
              import java.awt.Font;
              import java.awt.event.ActionEvent;
              import java.awt.event.ActionListener;
              import java.awt.event.KeyEvent;
              import java.awt.event.KeyListener;
              
              
              
              import javax.swing.JButton;
              import javax.swing.JFrame;
              import javax.swing.JLabel;
              import javax.swing.JPanel;
              import javax.swing.JTextField;
              
              
              
              
              public class affichage implements Observateur  {
              
              	
              	public  void glob(){
              	
              		
              		JTextField mot=new JTextField();
              		JPanel panel= new JPanel();
              		JButton bouton1 = new JButton("efface");
              	 Font f=new Font("Arial", Font.BOLD, 20);
              		bouton1.setFont(f);
              					  
              		bouton1.setBackground(Color.gray);
              		 bouton1.setForeground(Color.black);
              		bouton1.setBounds(20, 80, 100, 40); //positionnement du bouton en partant du coin gauche x horiz y verti v long ww larg
              		 panel.add(bouton1);
              		 JButton bouton2 = new JButton("apparait ");		
              		 Font f2=new Font("Arial", Font.BOLD, 20);
              		 bouton2.setFont(f2);
              		 			  
              		 bouton2.setBackground(Color.gray);
              		 			  
              		 bouton2.setForeground(Color.black);
              		 			  
              		 bouton2.setBounds(400,80,150, 40);  
              		 panel.add(bouton2);
              	
              		JLabel label = new JLabel("temps", JLabel.CENTER);
              		Font f14=new Font("Arial", Font.BOLD, 20);
              	    label.setFont(f14);
              		 JFrame pan = new JFrame("saisie rapide");
              		 mot.setVisible(true);
              	 pan.setAlwaysOnTop( true );//pour que la fenetre s affiche devant le reste
              	   pan.setContentPane(panel);
              	   pan.setSize(580, 400);// taille de la fenetre
              	   pan.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
              	    pan.setLocationRelativeTo(null);
              	    Font gt=new Font("Arial", Font.BOLD, 20);
              	    label.setBounds(20,200, 80, 60);
              	    
              	 
              	  
              	 
              	  		
              		 mot.setFont(gt);//caractristiques case texte entree
              		mot.setBounds(250,200, 100,60);
              	   panel.setLayout(null);
              	   panel.add(label);
              	   panel.add(mot);
              	   bouton1.addActionListener(new ActionListener() {//clic sur chiffre 1
              		   public void actionPerformed(ActionEvent ae) {
              			   mot.setVisible(false);//efface la case retour "mot" quand on clic dessus
              		   }});
              	   bouton2.addActionListener(new ActionListener() {//clic sur chiffre 1
              		   public void actionPerformed(ActionEvent ae) {
              			   mot.setVisible(true);//remet la case retour "mot" quand on clic dessus
              			   mot.requestFocus();//permet d avoir le focus sur la case de rentree
              		   }});
              	
              	    KeyListener keyListener = new KeyListener() {
              		       public  void keyPressed(KeyEvent keyEvent) {
              		        printIt( "Presse" , keyEvent);
              		    	if (keyEvent.getKeyCode() == KeyEvent.VK_ENTER) {//action quand on appui sur entree
              					
              					String g=mot.getText();//recupereation de la valeur rentree
              					System.out.println("appui sur entree donne"+g);
              				}
              		      }
              
              		      public  void keyReleased(KeyEvent keyEvent) {
              		        printIt( "Released" , keyEvent);
              		      }
              
              		      public  void keyTyped(KeyEvent keyEvent) {
              		        printIt( "Typed" , keyEvent);
              		      }
              
              		      private  void printIt(String title, KeyEvent keyEvent) {
              		         int keyCode = keyEvent.getKeyCode();
              		        String keyText = KeyEvent.getKeyText(keyCode);
              		        System.out.println(title + " : " + keyText + " / " + keyEvent.getKeyChar());
              		      }
              		    } ;
              		    mot.addKeyListener(keyListener);
              	   
              	 ;
              	   pan.setVisible(true);
              	
              	   // instanciantion d'un objet de type Runnable
              	  compteurtemps alpha =  new compteurtemps() ;
              
              		 // construction d'un Thread en passant cette instance de Runnable en paramètre
              		Thread thread =  new Thread(alpha) ;
              
              		 // lancement de ce thread par appel à sa méthode start()
              		thread.start() ;
              		
              		 
              
              	}
              
              	@Override
              	public void actualiser(Observable o) {
              		  
              	             if(o instanceof compteurtemps)
              	             {       
              	                     compteurtemps g = (compteurtemps) o;
              	                     System.out.println("j dans affichage : "+g.getPosition());
              	             }                     
              	     }
              	}
              
              	
              package decomptetempscompletpatternobser;
              
              import java.util.ArrayList;
              import java.util.List;
              import java.util.concurrent.TimeUnit;
              
              
              
              public class compteurtemps implements Observable,Runnable {
              	private static Object j = null;
              	private ArrayList tabObservateur;//=new ArrayList();// Tableau d'observateurs.
              	// implémentation de la méthode run() de l'interface Runnable
              	/*public  void compteurtemps() {
              	tabObservateur=new ArrayList();System.out.println("icifez");}*/
              	public compteurtemps() {tabObservateur=new ArrayList();}
                 public  void run() {
              	   
                  	//super.run();
                  	int i=0;
                  	
              		for(i=1 ; i <=10; i++){
              			
              			 //System.out.println("\b\b\b\b") ;//marche pas sous eclipse pour effacer la console
              			 // System.out.println("\b") ;
              			 // System.out.println("\b") ;
              		j=i;
              		
              		System.out.println("avant notification taille tabobserver"+tabObservateur.size());//ici le tableau est toujours vide§§§§§§§§§§§§§§§§§§§§§§
              		 
              		notifierObservateurs();
              		System.out.println("i="+i);
              		System.out.println("j="+j);
              		 try {
              	            TimeUnit.SECONDS.sleep(1);
              	        } catch (InterruptedException e) {
              	            e.printStackTrace();
              	        }
              		 System.out.println("apres tempo tabobserver"+tabObservateur.size());
              	}
                       
                    
                    }
              	
              
              
                  // Permet d'ajouter (abonner) un observateur à l'écoute 
                  public void ajouterObservateur(Observateur o)
                  {System.out.println("ici v "+o);
                          tabObservateur.add(o); 
                          System.out.println("ici v1");
                          System.out.println("apres ajout observateur taille tabobserver"+tabObservateur.size());
                          System.out.println("avant notification obs 0"+tabObservateur.get(0));
                         
                  }
                  
                
              
              
              
              	// Permet de supprimer (résilier) un observateur écoutant 
                  public void supprimerObservateur(Observateur o)
                  {
                         // tabObservateur.remove(o);              
                  }
              
              
                  // Méthode permettant de notifier tous les observateurs lors d'un changement d'état 
                  public void notifierObservateurs()
                  {System.out.println("ici  premiere notification observateur");
                  System.out.println("ici taille tabobserver"+tabObservateur.size());
                 	 for(int i=0;i<tabObservateur.size();i++)
                      {System.out.println("ici notification observateur");
                              Observateur o = (Observateur) tabObservateur.get(i);
                              o.actualiser(this);// On utilise la méthode "tiré".
                      }
                  }
              	
                  
                  public String getPosition()
                  {System.out.println("ici bas compteur");
                          return (String) j;
                  }
              	
              
                       
                    
              	
              	
              
              	
              
              
                 }
              package decomptetempscompletpatternobser;
              
              
              
              //Interface implémentée par tous les observateurs.
              public interface Observateur
              {
               // Méthode appelée automatiquement lorsque l'état de compteurtemps change.
               public void actualiser(Observable o);
              }
              package decomptetempscompletpatternobser;
              
              
              
              //Interface implémentée par toutes les classes souhaitant avoir des observateurs à leur écoute.
              public interface Observable
              {
               // Méthode permettant d'ajouter (abonner) un observateur.
               public void ajouterObservateur(Observateur o);
               // Méthode permettant de supprimer (résilier) un observateur.
               public void supprimerObservateur(Observateur o);
               // Méthode qui permet d'avertir tous les observateurs lors d'un changement d'état.
               public void notifierObservateurs();
              }
              

              voila,vous avez tout;merci d avance






              -
              Edité par vulcain1972 30 novembre 2022 à 11:28:59

              • Partager sur Facebook
              • Partager sur Twitter
                30 novembre 2022 à 18:51:57

                Bonjour,

                Tu as un compteur temps mais tu ne le "start" pas.

                • Partager sur Facebook
                • Partager sur Twitter
                  1 décembre 2022 à 10:41:54

                  bonjour

                  peut etre que je ne comprend pas ta remarque brubru777,mais ,pour moi ,mon compteurtemps demarre bien puisque je le lance dans la classe affichage  grace au Thread,le but etant de faire un decompte de temps sans impacter le deroulement du reste du programme ,et d afficher dans la classe affichage une case ou la valeur de compteurtemps serait lue;c est pour cela que j essaye de recuperer la valeur avec un pattern observer,et que je n y arrive pas;si tu teste mon code ,tu devrais voir dans la console le temps se derouler jusqu a 10 seconde;en tout cas moi c est ce qui se passe;mais visiblement j ai un probleme pour "inscrire" la classe affichage dans la liste des observateurs

                  voila,mais peut etre que je n est pas compris ta suggestion dans le cadre de mon probleme de pettern observer

                  -
                  Edité par vulcain1972 1 décembre 2022 à 10:42:44

                  • Partager sur Facebook
                  • Partager sur Twitter
                    1 décembre 2022 à 16:55:22

                    Tu enregistres ton observateur apres avoir demarre

                    C'est assez difficile de lire ton code et comprendre ce qu'il fait a cause du bruit(commentaires dans tous les sens, des fonctions inutiles pour le probleme,...) et de la nomenclature parfois hasardeuse des variables (g, alpha, mot...)

                    Pour s'y retrouver (nous tout comme toi) un peu de nettoyage ferait le plus grand bien:

                    1) retirer les commentaires et les system out, le debugger est fait pour ca

                    2) isoler le code problematique du reste, a savoir une methode qui calcule un temps, une methode qui l'affiche et de quoi faire le lien entre les 2, tout le reste est dispensable ici.

                    3) nommer les variables de maniere expressive

                    • Partager sur Facebook
                    • Partager sur Twitter
                      5 décembre 2022 à 19:29:19

                      bonjour

                      voici mon nouveau code epuré

                      package decompteobservateurforum;
                      
                      public class Main {
                      	 
                          public static void main(String[] args) {
                             
                              compteurtemps g = new compteurtemps();
                             
                              affichage ar = new affichage();
                              ar.fenetre();
                            
                              g.ajouterObservateur(ar);
                              
                               
                      }
                       
                      }
                      package decompteobservateurforum;
                      
                      
                      import java.awt.Color;
                      import java.awt.Font;
                      import java.awt.event.ActionEvent;
                      import java.awt.event.ActionListener;
                      import javax.swing.JButton;
                      import javax.swing.JFrame;
                      import javax.swing.JPanel;
                      
                      
                      public class affichage implements Observateur  {
                      
                         
                        public  void fenetre(){
                         
                             
                           
                            JPanel panel= new JPanel();
                            JButton bouton1 = new JButton("thread start");
                         Font f=new Font("Arial", Font.BOLD, 20);
                            bouton1.setFont(f);
                                           
                            bouton1.setBackground(Color.gray);
                             bouton1.setForeground(Color.black);
                            bouton1.setBounds(20, 80, 100, 40); 
                             panel.add(bouton1);   
                             JFrame pan = new JFrame("ca lance decompte");
                            
                         pan.setAlwaysOnTop( true );
                           pan.setContentPane(panel);
                           pan.setSize(300, 150);
                           pan.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                            pan.setLocationRelativeTo(null);
                             
                                 
                          
                           bouton1.addActionListener(new ActionListener() {//clic sur bouton1 lance le decompte du temps en thread
                               public void actionPerformed(ActionEvent ae) {
                              	 
                              	    compteurtemps alpha =  new compteurtemps() ;
                      
                              	      
                              	      Thread thread =  new Thread(alpha) ;
                      
                              	       
                              	      thread.start() ;
                               }}); 
                            
                         
                           pan.setVisible(true);   
                         
                      
                        }
                      
                        @Override
                        public void actualiser(Observable o) {
                               
                                     if(o instanceof compteurtemps)
                                     {      
                                             compteurtemps g = (compteurtemps) o;
                                             
                                             System.out.println("j dans affichage : "+g.getPosition());
                                             //je voudrais avoir l affichage de la valeur dans la console
                                     }                    
                             }
                        }
                      
                      package decompteobservateurforum;
                      
                      import java.util.ArrayList;
                      import java.util.List;
                      import java.util.concurrent.TimeUnit;
                       
                       
                       
                      public class compteurtemps implements Observable,Runnable {
                          private static Object j = null;
                          private ArrayList tabObservateur;    
                          public compteurtemps() {tabObservateur=new ArrayList();}
                         public  void run() {
                              
                               int i=0;
                               
                              for(i=1 ; i <=10; i++){
                              	System.out.println(" dans compteur temps i="+i);
                              	//juste pour montrer que mon thread est bien lancé
                              j=i;          
                              notifierObservateurs();
                              
                               try {
                                      TimeUnit.SECONDS.sleep(1);
                                  } 
                               catch (InterruptedException e) {
                                      e.printStackTrace();
                                  }
                              
                          }
                                
                             
                            }
                          
                          public void ajouterObservateur(Observateur o)
                          {
                                  tabObservateur.add(o);
                                     
                          } 
                          public void supprimerObservateur(Observateur o)
                          {
                                             
                          }
                       
                       
                          public void notifierObservateurs()
                          {
                           for(int i=0;i<tabObservateur.size();i++)
                              {
                                      Observateur o = (Observateur) tabObservateur.get(i);
                                      o.actualiser(this);
                              }
                          }
                           
                           
                          public String getPosition()
                          {
                                  return (String) j;
                          }
                         
                         }
                      package decompteobservateurforum;
                      
                      
                      public interface Observateur
                      {
                      
                      public void actualiser(Observable o);
                      }
                      package decompteobservateurforum;
                      
                      public interface Observable
                      {
                       
                       public void ajouterObservateur(Observateur o);
                       
                       public void supprimerObservateur(Observateur o);
                       
                       public void notifierObservateurs();
                      }

                      voila;donc je n arrive pas a avoir de retour de la valeur de mon thread;si j ai bien compris,dans le main ,j inscrit ma classe affichage en observateur de ma classe compteurtemps,mais ,comme ma classe affichage lance un thread dans compteurtemps,cela signifie que je reouvre  a nouveau ma classe compteurtemps ,mais cette fois ,elle n est pas inscrite comme etant observée;donc elle se lance sans rien renvoyer;bon ,par ailleurs ,j ai essayé sans succès, de mettre dans un fichier txt la valeur du tableau  tabobservateur ou je met (implemente??? comme disent les vrais??) mes observateur pour forcer lors de la seconde ouverture de compteurtemps le remplissage de cet aaraylist qui est alors vide avec le contenu de ce fichier,mais ca ne va pas,car ,je suppose que j ai un probleme de type de données;donc,je suis toujours planté;merci de vos conseils




                      • Partager sur Facebook
                      • Partager sur Twitter
                        5 décembre 2022 à 20:44:22

                        On y voit beaucoup plu clair comme ca,

                        Tu ajoutes ton observateur sur le compteurTemps du main, nomme g.

                        Par contre c'est sur le compteurTemps alpha que tu fais tourner.

                        C'est comme Highlander, il ne peut en rester qu'un!

                        • Partager sur Facebook
                        • Partager sur Twitter
                          6 décembre 2022 à 19:02:47

                          bonjour

                          merci pxl;c est ce que je pensais;mais du coup,vu que dans un premier temps j avais essayé de ne pas faire de main "dédié" a la création d un observateur,en fusionant l appel d a l observateur et l affichage,ca n etait pas bon,puis dans un second temps j ai crée un main et une classe affichage,mais que je ne peut pas lancer un thread  ailleurs que dans la classe affichage,et que je ne peut lancer mon pattern observer que dans la classe main,est ce que ca signifie que mon idée est impossible?je ne vois pas comment lancer un observateur sur un thread qui lui est lancé apres appui sur un bouton

                          • Partager sur Facebook
                          • Partager sur Twitter
                            6 décembre 2022 à 21:08:57

                            Ton besoin est simple, tu te compliques la vie avec ton observateur, comme je te l'ai dit avant un simple listener fera la boulot:

                            ton affichage implemente ta classe listener

                            tu ajoutes le listener au timer

                            tu invoques le listener a chaque iteration

                            • Partager sur Facebook
                            • Partager sur Twitter
                              12 décembre 2022 à 11:17:46

                              j ai pas abandonné;j essaye de mettre un listener sur mon thread,mais je pattine grave sans resultat a montrer pour l instant; d ici un ou deux ans,peut etre.....
                              • Partager sur Facebook
                              • Partager sur Twitter
                                13 décembre 2022 à 7:49:59

                                bon on va essayer de reduire ce delai avec un petit coup de pouce dans ce cas:

                                Tu crees une interface qui permettra de lier ta vue et ton compteur sans lier leur types ( et donc de les changer sans impact, et limiter les methodes accessibles):

                                public interface CounterListener {
                                    void onChange(long time);
                                }

                                Ensuite, la vue, n'utilisant jamais Swing je ne garanti pas les bonnes pratiques dessus.

                                La vue implemente le Listener pour etre utilisable par le Counter:

                                public class View implements CounterListener {
                                
                                    private final JLabel textLine;
                                
                                
                                    private View() {
                                         var frame = new JFrame("test");
                                        frame.setSize(100,100);
                                        this.textLine = new JLabel();
                                        frame.add(this.textLine);
                                        frame.setVisible(true);
                                    }
                                
                                    @Override
                                    public void onChange(long time) {
                                        this.textLine.setText(String.valueOf(time));
                                    }
                                }

                                Enfin, le compteur un bete thread qui va tourner et notifier le listener:

                                public class CounterRunner implements Runnable {
                                
                                    private final CounterListener listener;
                                
                                    private CounterRunner(CounterListener listener) {
                                        this.listener = listener;
                                    }
                                
                                    @Override
                                    public void run() {
                                        var now = System.currentTimeMillis();
                                        while (System.currentTimeMillis() < now + 5000) {
                                            this.listener.onChange(System.currentTimeMillis());
                                        }
                                    }
                                }


                                et enfin, un main pour lancer:

                                public static void main(String[] args) {
                                    new Thread(new CounterRunner(new View())).start();
                                }






                                • Partager sur Facebook
                                • Partager sur Twitter
                                  5 janvier 2023 à 19:39:38

                                  bonjour

                                  merci pxl de ta reponse

                                  j ai adapté ceci a mon code;mais au final,comme je voulais faire un bouton qui lance mon thread et ensuite l observer pour recuperer et afficher sa valeur ,ca me faisait des trucs comme si je prenait une photo instantannée de la valeur du thread

                                  bref ,en fait ,comme le but c etait de faire un compte a rebours d un jeu ,qui ne bloque pas le jeu ,qui soit lancé quand on clic sur un bouton et qui s arrete et se reinitialise quand on passe a l etape suivante,je crois que j ai cherché a faire compliqué ,alors que j ai "decouvert" l existance de"timer java",qui permet de faire tout cela facilement; en plus ,c est un thread,donc ca ne bloque pas le deroulement de mon code quand je fais autre chose

                                  merci de vos reponses, pour moi j ai ce qu il me faut;a voir si il faut fermer ce post ,car ma solution n est en fait pas une solution conforme au defi de depart

                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    6 janvier 2023 à 10:44:49

                                    Salut, si c'est pour un jeu, il faut savoir qu'un pattern classique dans ce cas est de faire une boucle de jeu(game loop https://gameprogrammingpatterns.com/game-loop.html ), laquelle va faire un tour de boucle pour chaque frame, et dans ce tour seront lance les différentes fonctions nécessaires au déroulement du jeu, en y gérant le temps également(nécessaire pour garantir que la vitesse des éléments de jeu ne dépende pas de la vitesse d'exécution de la machine)

                                    Un timer y aurait tout a fait sa place en profitant du calcul de temps dans la frame.

                                    • Partager sur Facebook
                                    • Partager sur Twitter

                                    quelqu un a til un exemple de pattern observer

                                    × 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