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)
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.
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?
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
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)
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
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
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.
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
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
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.....
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();
}
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
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.
× 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.
PXL Le retro gaming facile Thread sur le forum: https://openclassrooms.com/forum/sujet/retro-pxl
PXL Le retro gaming facile Thread sur le forum: https://openclassrooms.com/forum/sujet/retro-pxl
PXL Le retro gaming facile Thread sur le forum: https://openclassrooms.com/forum/sujet/retro-pxl
PXL Le retro gaming facile Thread sur le forum: https://openclassrooms.com/forum/sujet/retro-pxl
PXL Le retro gaming facile Thread sur le forum: https://openclassrooms.com/forum/sujet/retro-pxl
PXL Le retro gaming facile Thread sur le forum: https://openclassrooms.com/forum/sujet/retro-pxl
PXL Le retro gaming facile Thread sur le forum: https://openclassrooms.com/forum/sujet/retro-pxl