[ALG3IR][Java] PropertyChangeListener && LedClickable

Voir le sujet précédent Voir le sujet suivant Aller en bas

resolu [ALG3IR][Java] PropertyChangeListener && LedClickable

Message  galaeron le Lun 12 Nov 2012, 23:46

Bonjour,

J'aurais deux questions concernant le projet 1 (Game of Life) :

Premièrement : Le composant LedClickable doit-il (comme je le pense) implémenter MouseListener ?
Deuxièmement : Il m'a paru nécessaire d'ajouter un PropertyChangeListener par LedClickable dans la classe JBoard afin de pouvoir transformer celui-ci en contrôleur. Ceci se faisant comme suit :
Code:
    private void initObservateur(final int line, final int row) {

        ledWorld[line][row].addPropertyChangeListener(new PropertyChangeListener() {

            @Override
            public void propertyChange(PropertyChangeEvent evt) {
                if (evt.getPropertyName().equals(new Integer(ledWorld[line][row].hashCode()).toString())) {
                    getModele().setCellState(!getModele().getWorld()[line][row], line, row);
                }
            }
        });   
    }
Il m'est rapidement apparu cependant que si chaque LedClickable n'avait pas son propre nom de propriété, tous les observateurs (de chaque LED) recevaient le PropertyChangeEvent. (Même si ceux-ci n'écoutent pas la led source ...)
J'ai donc comme vous pouvez le voir trouvez une "parade" temporaire en indiquant à chaque LedClickable un "ID" dépendant de sa position dans le GridBagLayout mais j'aurais voulu savoir si quelque chose de plus "propre" existait ou si mon raisonnement tenait la route.

D'avance merci.



EDIT : En y réfléchissant cette nuit je me suis débarrassé des attributs dans ledClickable au profit du hashcode de l'objet


Dernière édition par galaeron le Mar 20 Nov 2012, 09:47, édité 1 fois

galaeron

Nombre de messages : 113
Age : 28
Prénom : Arthur
Statut : 3IR12
Date d'inscription : 29/06/2011

Revenir en haut Aller en bas

resolu Re: [ALG3IR][Java] PropertyChangeListener && LedClickable

Message  pbt le Mar 13 Nov 2012, 22:05

galaeron a écrit:Premièrement : Le composant LedClickable doit-il (comme je le pense) implémenter MouseListener ?
Oui ou biern tu lui ajoutes un MouseListener et tu utilises une classe interne anonyme héritant de MouseAdapter … à ta meilleure convenance.

galaeron a écrit:Deuxièmement : Il m'a paru nécessaire d'ajouter un PropertyChangeListener par LedClickable dans la classe JBoard afin de pouvoir transformer celui-ci en contrôleur. Ceci se faisant comme suit :
Code:
    private void initObservateur(final int line, final int row) {

        ledWorld[line][row].addPropertyChangeListener(new PropertyChangeListener() {

            @Override
            public void propertyChange(PropertyChangeEvent evt) {
                if (evt.getPropertyName().equals(new Integer(ledWorld[line][row].hashCode()).toString())) {
                    getModele().setCellState(!getModele().getWorld()[line][row], line, row);
                }
            }
        });   
    }
Il m'est rapidement apparu cependant que si chaque LedClickable n'avait pas son propre nom de propriété, tous les observateurs (de chaque LED) recevaient le PropertyChangeEvent. (Même si ceux-ci n'écoutent pas la led source ...)
J'ai donc comme vous pouvez le voir trouvez une "parade" temporaire en indiquant à chaque LedClickable un "ID" dépendant de sa position dans le GridBagLayout mais j'aurais voulu savoir si quelque chose de plus "propre" existait ou si mon raisonnement tenait la route.

D'avance merci.



EDIT : En y réfléchissant cette nuit je me suis débarrassé des attributs dans ledClickable au profit du hashcode de l'objet
Mmh, je n'aime pas ce que tu écris, je ne trouve pas ça propre … par contre tu soulèves le bon problème: « Est-ce qu'un led doit connaitre sa position sur le plateau ou bien le board doit la trouver lui-même »… je t'y laisse réfléchir.

Si un led doit connaitre sa position, il faut que tu utilises une classe LedClickableOnBoard ayant 2 attributs supplémentaires; ligne, colonne. En récupérant ton LedClickableOnBoard, tu as de suite sa position.

(À toi de voir si c'est judicieux de passer l'état d'une cellule au modèle ou si c'est mieux de passer un «état complet» (boolean[][]) au modèle lorsque l'utilisateur a terminé de positionner un état).

Si un led ne connait pas sa position (tu évites d'écrire une classe spécifique à un led sur de plateau) tu seras obligé de parcourir tous les leds pour trouver le led cliqué … à chaque click.

Bref … à analyser un peu ;-)

_________________
smartq.namok.be · faq ·  · IRC / irc.freenode.net #esi · blog.namok.be
style #pbt {heigth:189cm; weight:79kg; eye-color:#524000; hair:very short; dead pixels: some; }

pbt
Admin

Nombre de messages : 4862
Age : 45
Prénom : Pierre
Statut : prof
Localisation : La cité des géants
Date d'inscription : 24/11/2005

http://esi.namok.be

Revenir en haut Aller en bas

resolu Re: [ALG3IR][Java] PropertyChangeListener && LedClickable

Message  galaeron le Mar 13 Nov 2012, 22:13

Même si je comprends vos suggestions, je ne comprends pas en quoi ce que j'ai fait n'est pas propre ? Je m'explique : j'ai d'abord essayé de faire un getSource mais apparemment son comportement n'est pas exactement celui que j'attendais ... J'ai par conséquent trouvé un moyen moins lourds (il me semble) que de crée une autre classe ou de parcourir toutes les leds ...

galaeron

Nombre de messages : 113
Age : 28
Prénom : Arthur
Statut : 3IR12
Date d'inscription : 29/06/2011

Revenir en haut Aller en bas

resolu Re: [ALG3IR][Java] PropertyChangeListener && LedClickable

Message  pbt le Mar 13 Nov 2012, 23:25

Code:
if (evt.getPropertyName().equals(new Integer(ledWorld[line][row].hashCode()).toString())) {
                    getModele().setCellState(!getModele().getWorld()[line][row], line, row);
                }
Donc pour toi c'est mieux de
  • calculer un hashcode
  • sur cette base, créer un integer
  • convertir en string
  • et tester l'égalité


Je trouve que c'est plus lisible
Code:
if (evt.getPropertyName().equals(LedClickable.PROPERTY_CLICKED)) {
            LedClickableOnBoard led = (LedClickableOnBoard) evt.getSource();
            int ligne = led.getLigne();
            int colonne = led.getColonne();

… bon je dors sur ce code et argumente peut être demain …

_________________
smartq.namok.be · faq ·  · IRC / irc.freenode.net #esi · blog.namok.be
style #pbt {heigth:189cm; weight:79kg; eye-color:#524000; hair:very short; dead pixels: some; }

pbt
Admin

Nombre de messages : 4862
Age : 45
Prénom : Pierre
Statut : prof
Localisation : La cité des géants
Date d'inscription : 24/11/2005

http://esi.namok.be

Revenir en haut Aller en bas

resolu Re: [ALG3IR][Java] PropertyChangeListener && LedClickable

Message  galaeron le Mer 14 Nov 2012, 09:54

En y repensant un hashcode n'est PAS une représentation unique de l'identité d'un objet et par conséquent mon code pourrait être pris en défaut.
Cependant je ne pense pas que l'idée soit mauvaise puisqu'il semble moins "lourd" en effet vous faites :
  • Comparé le nom d'une property name (Comme moi)
  • Créer une instance de LedClickableOnBoad
    • Plus "lourd" qu'un string
    • Aller chercher une référence d'un objet
    • Caster l'objet

  • Créer deux int en allant utiliser deux getter


Quid d'une solution mixte du style ajouter un attribut "ID" unique généré à la création dans ledClickable ne perturbant en rien la portabilité ...

galaeron

Nombre de messages : 113
Age : 28
Prénom : Arthur
Statut : 3IR12
Date d'inscription : 29/06/2011

Revenir en haut Aller en bas

resolu Re: [ALG3IR][Java] PropertyChangeListener && LedClickable

Message  pbt le Mer 14 Nov 2012, 10:02

galaeron a écrit:En y repensant un hashcode n'est PAS une représentation unique de l'identité d'un objet et par conséquent mon code pourrait être pris en défaut.
Exact ;-)

galaeron a écrit:[*] Créer une instance de LedClickableOnBoad
  • Plus "lourd" qu'un string
  • Aller chercher une référence d'un objet
  • Caster l'objet
Je n'instancie pas d'objet, je récupère sa référence (par le biais d'un cast).

_________________
smartq.namok.be · faq ·  · IRC / irc.freenode.net #esi · blog.namok.be
style #pbt {heigth:189cm; weight:79kg; eye-color:#524000; hair:very short; dead pixels: some; }

pbt
Admin

Nombre de messages : 4862
Age : 45
Prénom : Pierre
Statut : prof
Localisation : La cité des géants
Date d'inscription : 24/11/2005

http://esi.namok.be

Revenir en haut Aller en bas

resolu Re: [ALG3IR][Java] PropertyChangeListener && LedClickable

Message  galaeron le Mer 14 Nov 2012, 10:05

pbt a écrit:
Je n'instancie pas d'objet, je récupère sa référence (par le biais d'un cast).
Juste au temps pour moi, légère différence entre java et c/c++ =')

Cela dit ma remarque faite via un edit du message précédent
galaeron a écrit:Quid d'une solution mixte du style ajouter un attribut "ID" unique généré à la création dans ledClickable ne perturbant en rien la portabilité ...
n'est elle pas judicieuse? (ou réécrire la méthode hashcode())

galaeron

Nombre de messages : 113
Age : 28
Prénom : Arthur
Statut : 3IR12
Date d'inscription : 29/06/2011

Revenir en haut Aller en bas

resolu Re: [ALG3IR][Java] PropertyChangeListener && LedClickable

Message  pbt le Mer 14 Nov 2012, 10:35

galaeron a écrit:Cela dit ma remarque faite via un edit du message précédent
galaeron a écrit:Quid d'une solution mixte du style ajouter un attribut "ID" unique généré à la création dans ledClickable ne perturbant en rien la portabilité ...
n'est elle pas judicieuse? (ou réécrire la méthode hashcode())


Si ton ID unique ne représente pas la position du led dans le monde, je ne comprend plus bien. Mais je pense n'avoir qu'une vue partielle de ton code.

Édité
Voilà, je percute ! J'ai l'habitude de n'avoir qu'un seul propertychangelistener pour tous mes leds … ce qui m'impose de chercher (ou d'avoir mémorisé) la position du led «qui me parle». Extrait de mon setState
Code:
for (int row = 0; row < state.length; row++) {
            for (int col = 0; col < state[row].length; col++) {               
                LedClickable led = new LedClickable();
                led.setOn(state[row][col]);
                led.addPropertyChangeListener(this);
                ...

Dans ton cas (je n'avais pas vu que tu assignes un propertychangelistener à chaque leds (et c'est plus cher)), chaque propertychange étant différent, inutile de chercher / mémoriser la position, car on peut donner «une position fixe» à chacun lors de la création. Et donc, extrait de code
Code:
for (int row = 0; row < state.length; row++) {
            for (int col = 0; col < state[row].length; col++) {
                final int cstCol = col;
                final int cstRow = row;
                LedClickable led = new LedClickable();
                led.setOn(state[row][col]);
                led.addPropertyChangeListener(new PropertyChangeListener() {

                    @Override
                    public void propertyChange(PropertyChangeEvent evt) {
                        if (evt.getPropertyName().equals(LedClickable.PROPERTY_CLICKED)) {
                        System.out.println("Find 2 (" + cstCol + "," + cstRow + ")");
                        }
                    }
                });
Et tu vois qu'il est inutile de faire ton «hashcode/tostring».

est-ce que ceci éclaire l'ensemble ?


_________________
smartq.namok.be · faq ·  · IRC / irc.freenode.net #esi · blog.namok.be
style #pbt {heigth:189cm; weight:79kg; eye-color:#524000; hair:very short; dead pixels: some; }

pbt
Admin

Nombre de messages : 4862
Age : 45
Prénom : Pierre
Statut : prof
Localisation : La cité des géants
Date d'inscription : 24/11/2005

http://esi.namok.be

Revenir en haut Aller en bas

resolu Re: [ALG3IR][Java] PropertyChangeListener && LedClickable

Message  galaeron le Mer 14 Nov 2012, 10:53

galaeron a écrit:
Code:
    private void initObservateur(final int line, final int row) {

        ledWorld[line][row].addPropertyChangeListener(new PropertyChangeListener() {

            @Override
            public void propertyChange(PropertyChangeEvent evt) {
                if (evt.getPropertyName().equals(new Integer(ledWorld[line][row].hashCode()).toString())) {
                    getModele().setCellState(!getModele().getWorld()[line][row], line, row);
                }
            }
        });   
    }

Je modifierais donc ceci afin d'avoir quelque chose du style
Code:
    private void initObservateur(final int line, final int row) {

        ledWorld[line][row].addPropertyChangeListener(new PropertyChangeListener() {

            @Override
            public void propertyChange(PropertyChangeEvent evt) {
                if (evt.getSource().hashCode().equals(ledWorld[line][row].hashCode())) {
                    getModele().setCellState(!getModele().getWorld()[line][row], line, row);
                }
            }
        });   
    }

Cela semblerait plus "propre"?

galaeron

Nombre de messages : 113
Age : 28
Prénom : Arthur
Statut : 3IR12
Date d'inscription : 29/06/2011

Revenir en haut Aller en bas

resolu Re: [ALG3IR][Java] PropertyChangeListener && LedClickable

Message  pbt le Mer 14 Nov 2012, 11:07

Pourquoi pas simplement ?
Code:
(evt.getPropertyName().equals(LedClickable.PROPERTY_CLICKED))

_________________
smartq.namok.be · faq ·  · IRC / irc.freenode.net #esi · blog.namok.be
style #pbt {heigth:189cm; weight:79kg; eye-color:#524000; hair:very short; dead pixels: some; }

pbt
Admin

Nombre de messages : 4862
Age : 45
Prénom : Pierre
Statut : prof
Localisation : La cité des géants
Date d'inscription : 24/11/2005

http://esi.namok.be

Revenir en haut Aller en bas

resolu Re: [ALG3IR][Java] PropertyChangeListener && LedClickable

Message  galaeron le Mer 14 Nov 2012, 11:09

Comme ça je sais directement quelle led a été cliquée sans devoir refaire une autre classe avec deux attributs supplémentaires.

galaeron

Nombre de messages : 113
Age : 28
Prénom : Arthur
Statut : 3IR12
Date d'inscription : 29/06/2011

Revenir en haut Aller en bas

resolu Re: [ALG3IR][Java] PropertyChangeListener && LedClickable

Message  pbt le Mer 14 Nov 2012, 11:27

galaeron a écrit:Comme ça je sais directement quelle led a été cliquée sans devoir refaire une autre classe avec deux attributs supplémentaires.
Alors relis

_________________
smartq.namok.be · faq ·  · IRC / irc.freenode.net #esi · blog.namok.be
style #pbt {heigth:189cm; weight:79kg; eye-color:#524000; hair:very short; dead pixels: some; }

pbt
Admin

Nombre de messages : 4862
Age : 45
Prénom : Pierre
Statut : prof
Localisation : La cité des géants
Date d'inscription : 24/11/2005

http://esi.namok.be

Revenir en haut Aller en bas

resolu Re: [ALG3IR][Java] PropertyChangeListener && LedClickable

Message  galaeron le Mer 14 Nov 2012, 11:56

Ok désolé je n'avais pas vu l'edit !
pbt a écrit:
J'ai l'habitude de n'avoir qu'un seul propertychangelistener pour tous mes leds … ce qui m'impose de chercher (ou d'avoir mémorisé) la position du led «qui me parle». Extrait de mon setState
Code:
for (int row = 0; row < state.length; row++) {
            for (int col = 0; col < state[row].length; col++) {               
                LedClickable led = new LedClickable();
                led.setOn(state[row][col]);
                led.addPropertyChangeListener(this);
                ...

En effet c'est d'autant plus efficace, j'avais "oublier" que le jBoard était aussi capable d'écouter ! Je me baserais donc sur ça ...

NB : Je viens de comprendre l'erreur qui m'a poussé à faire cette histoire de hashcode. Je m'explique, au début dans mon code, mon firePropertyChange se faisait comme suit
Code:
firePropertyChange("color",!on,on);
et je testais dans les observateurs par
Code:
 if(evt.getPropertyName().equals("color"))
ce qui était évidemment toujours vrais et par conséquent tous les observateurs se déclenchaient en même temps ... J'ai donc crus qu'il fallait par un moyen qcq retrouver la source ...

Enfin ... maintenant que j'ai compris je devrais pouvoir alléger considérablement mon programme ....
Merci pour vos explications et votre patience qui, à mon avis, pourront servir aussi à d'autres !

galaeron

Nombre de messages : 113
Age : 28
Prénom : Arthur
Statut : 3IR12
Date d'inscription : 29/06/2011

Revenir en haut Aller en bas

resolu Re: [ALG3IR][Java] PropertyChangeListener && LedClickable

Message  pbt le Mer 14 Nov 2012, 14:01

galaeron a écrit:NB : Je viens de comprendre l'erreur qui m'a poussé à faire cette histoire de hashcode. Je m'explique, au début dans mon code, mon firePropertyChange se faisait comme suit
Code:
firePropertyChange("color",!on,on);
et je testais dans les observateurs par
Code:
 if(evt.getPropertyName().equals("color"))
ce qui était évidemment toujours vrais et par conséquent tous les observateurs se déclenchaient en même temps ... J'ai donc crus qu'il fallait par un moyen qcq retrouver la source ...
Ben non justement puisque chaque led a un observateur différent

_________________
smartq.namok.be · faq ·  · IRC / irc.freenode.net #esi · blog.namok.be
style #pbt {heigth:189cm; weight:79kg; eye-color:#524000; hair:very short; dead pixels: some; }

pbt
Admin

Nombre de messages : 4862
Age : 45
Prénom : Pierre
Statut : prof
Localisation : La cité des géants
Date d'inscription : 24/11/2005

http://esi.namok.be

Revenir en haut Aller en bas

resolu Re: [ALG3IR][Java] PropertyChangeListener && LedClickable

Message  galaeron le Mer 14 Nov 2012, 20:20

J'aurais eu tendance à dire ça aussi ... sauf que dans la pratique c'était pas vraiment le cas ... maintenant le problème venait peux être d'ailleurs mais il me semble pas ...

galaeron

Nombre de messages : 113
Age : 28
Prénom : Arthur
Statut : 3IR12
Date d'inscription : 29/06/2011

Revenir en haut Aller en bas

resolu Re: [ALG3IR][Java] PropertyChangeListener && LedClickable

Message  Contenu sponsorisé Aujourd'hui à 15:19


Contenu sponsorisé


Revenir en haut Aller en bas

Voir le sujet précédent Voir le sujet suivant Revenir en haut


 
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum