[ALG3ir-Java] Projet 1 - Serialization

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

resolu [ALG3ir-Java] Projet 1 - Serialization

Message  Aftab007 le Sam 24 Nov 2012, 16:15

Bonjour,

Je tente de faire fonctionner la sauvegarde du board et le chargement de celui-ci à l'aide de la serialization.
La sauvegarde dans un fichier et le chargement de celui-ci se passe bien ( dé serialization)

Le soucis c'est que maintenant que j'ai l'état d'un board je voudrais mettre ma MainView à jour.
Pour se faire je suis partie sur la même idée que la méthode resize qui change la taille du board. À savoir une méthode qui supprime les éléments du boards et je replace moi même les éléments dans celui-ci à l'aide du board que j' ai dé serializé.

Le bug que j'ai descellé c'est que l'objet reçu en paramètre ne semble pas tous à fait identique à celui que j'ai envoyé en paramètre.
Donc je suis sur d'envoyé un board avec que des Cellules vivantes. Et à ma grande surprise quand j'affiche l'état de ses leds dans ma méthode, elles sont toutes éteintes.
Je ne vois vraiment pas la nature du problème.
Si vous pourriez m'éclairer. ?

voici mon code :


Code:


    public void boardByFile(Board fileBoard) {
//        System.out.println("Debug boardByFile, nbLigne " + fileBoard.getNbrLigne());
//        System.out.println("Debug boardByFile, nbColonne " + fileBoard.getNbrColonne());
        fileBoard.affiche();
        this.removeAll();
        this.nbrLigne = fileBoard.getNbrLigne();
        this.nbrColonne = fileBoard.getNbrColonne();
        grdLayDeLedClickable = new GridLayout(nbrLigne, nbrColonne);
        this.setLayout(grdLayDeLedClickable);

        LedClickable[][] newTab2dDeLedClickable = new LedClickable[fileBoard.getNbrLigne()][fileBoard.getNbrColonne()];

        for (int i = 0; i < fileBoard.getNbrLigne(); ++i) {
            for (int j = 0; j < fileBoard.getNbrColonne(); ++j) {
                newTab2dDeLedClickable[i][j] = fileBoard.getTab2dDeLedClickable()[i][j];
                this.add(fileBoard.getTab2dDeLedClickable()[i][j]);
            }
        }
        tab2dDeLedClickable = newTab2dDeLedClickable;
        this.revalidate();
    }


Merci d'avance pour vos lumières Smile

Aftab007

Nombre de messages : 85
Age : 28
Prénom : Aftab
Date d'inscription : 27/11/2008

Revenir en haut Aller en bas

resolu Re: [ALG3ir-Java] Projet 1 - Serialization

Message  aro le Dim 25 Nov 2012, 11:07

Il doit être assez conséquent ton fichier, non ? Chaque LedClickable hérite de Led qui hérite de JPanel qui a tellement de propriétés.
Je ne peux pas te dire pourquoi tes leds sont éteints avec juste ce bout de code. Est-ce qu'il ne manque pas un repaint après revalidate ? As-tu vérifié ce que retourne getTab2dDeLedClickable ?
Mais, je n'arrive pas à voir l’intérêt de sérialiser tous les LedClickable. Pourquoi ne pas juste sauver/récupérer l'état on/off ?

aro

Nombre de messages : 557
Prénom : Anne
Statut : Prof
Date d'inscription : 06/09/2008

Revenir en haut Aller en bas

resolu Re: [ALG3ir-Java] Projet 1 - Serialization

Message  Aftab007 le Dim 25 Nov 2012, 12:30

Ils ne font que 10 ko les fichier, le truc c que c'est pas se code là qui pose problème comme vous le dites.
Mais effectivement si je peux alléger les choses pourquoi ne pas le faire : )

Donc pour être plus claire, quand je load le fichier dans ma méthode de désérialisation qui se lance lorsqu'on appui sur le bouton "File" j'affiche avec un system.out.println l'état d'un tableau de led clickable modifié.
Par contre une fois que j'appui sur le bouton OK, je fait un system.out.println() de ce board modifié et là il ne m'affiche plus l'état du board récupéré via la désarialization.

Code:


btFileCfgInit.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                int returnVal = fcOpenFile.showOpenDialog(LifeGameMainView.this);
                if (returnVal == JFileChooser.APPROVE_OPTION) {
                    File file = fcOpenFile.getSelectedFile();
                    FileInputStream fileInStream = null;
                    ObjectInputStream objectInStream = null;
                    try {
                        fileInStream = new FileInputStream(file);
                        objectInStream = new ObjectInputStream(fileInStream);
                        boardLedClickable = (Board) objectInStream.readObject();
                        System.out.println("debug : deserialization : ");
                        boardLedClickable.affiche();
                    } catch (FileNotFoundException ex) {
                        System.out.println("Une erreur est survenue sur le fichier : " + file.getName());
                    } catch (ClassNotFoundException ex) {
                        Logger.getLogger(LifeGameMainView.class.getName()).log(Level.SEVERE, null, ex);
                    } catch (IOException ex) {
                        Logger.getLogger(LifeGameMainView.class.getName()).log(Level.SEVERE, null, ex);
                    }
//                    System.out.println("Debug : Pas erreur est survenue sur le fichier : " + file.getName());
//                    System.out.println("Debug : Board getNbLigne : "+boardLedClickable.getNbrLigne());
//                    System.out.println("Debug : Model getNbLigne : "+getModel().getNbLines());
                    FileISChoosen = true;
                }
            }
        });

Voici l'état du board récupré lors du passage dans ce bout de code:

debug : deserialization :
true
true
false
false
false

true
true
false
false
false

false
false
false
false
false

false
false
false
false
false

Voici le bout de code quand j'appui sur le bouton OK dans ce cas le board n'est plus le même que quand je l'avais dé sérializé :

Code:
 
btOk.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if (!FileISChoosen) {
                    System.out.println("Debug : !FileIsChoosen" + FileISChoosen);
                    getModel().setNbLines(Integer.parseInt(labValueOfNbrLines.getText()));
                    getModel().setNbColumnns(Integer.parseInt(labValueOfNbrColumns.getText()));
                    getModel().setNbrMsEntreDeuxAvancementCpt(Integer.parseInt(labValueOfTimesBetweenTwoStates.getText()));
                    boardLedClickable.reSize(getModel().getNbLines(), getModel().getNbColumns());
                } else {
                    FileISChoosen = false;
                    getModel().setNbLines(boardLedClickable.getNbrLigne());
                    getModel().setNbColumnns(boardLedClickable.getNbrColonne());
                    // boardLedClickable.boardByFile(boardLedClickable);
//                    boardLedClickable.reSize(getModel().getNbLines(), getModel().getNbColumns());
//                    scrlPanBoardLedClickable.revalidate();
//                    scrlPanBoardLedClickable.repaint();
                    System.out.println("Debug : Board quand on click sur le bouton OK "); 
                    boardLedClickable.affiche();
//                    System.out.println("Debug btOK, nb Ligne dans le model  : "+getModel().getNbLines());
                }
            }
        });

Voici le résultat lors du passage dans ce bout de code :

Debug : Board quand on click sur le bouton OK
false
false
false
false
false

false
false
false
false
false

false
false
false
false
false

false
false
false
false
false



Ce qui m'échape c'est que je clique sur File, je choisi le fichier à désérializé, il le fait bien, puis quand je click sur OK c'est comme si javais un board initalisé à faux( un tableau de départ si je puis dire).
Il ne se passe qu'une fraction de seconde entre mes 2 clicks, et je ne passe par aucun code intermédiaire.

Je suis sur qu' il y a une notion qui m' échappe , mais je ne vois pas laquelle Sad


Aftab007

Nombre de messages : 85
Age : 28
Prénom : Aftab
Date d'inscription : 27/11/2008

Revenir en haut Aller en bas

resolu Re: [ALG3ir-Java] Projet 1 - Serialization

Message  aro le Dim 25 Nov 2012, 13:10

Aftab007 a écrit:Ils ne font que 10 ko les fichier, le truc c que c'est pas se code là qui pose problème comme vous le dites.
Ce n'est pas la taille physique du fichier qui est conséquente mais le nombre de choses inutiles dedans. Et, le fichier devrait permettre la sauvegarde de l'état, pas la sauvegarde des composants graphiques.
Aftab007 a écrit:Ce qui m'échape c'est que je clique sur File, je choisi le fichier à désérializé, il le fait bien, puis quand je click sur OK c'est comme si javais un board initalisé à faux( un tableau de départ si je puis dire).
Il ne se passe qu'une fraction de seconde entre mes 2 clicks, et je ne passe par aucun code intermédiaire.
Si, il y a du code intermédiaire puisque tu appelles des méthodes du modèle avant d'afficher. Et, pas celle qui lui donne un tableau de booléens pour le nouvel état mais celles pour changer le nombre de lignes et de colonnes...

aro

Nombre de messages : 557
Prénom : Anne
Statut : Prof
Date d'inscription : 06/09/2008

Revenir en haut Aller en bas

resolu Re: [ALG3ir-Java] Projet 1 - Serialization

Message  Aftab007 le Dim 25 Nov 2012, 14:08

aro a écrit:Ce n'est pas la taille physique du fichier qui est conséquente mais le nombre de choses inutiles dedans. Et, le fichier devrait permettre la sauvegarde de l'état, pas la sauvegarde des composants graphiques.
Ok je comprend ce que vous voulez-dire, toujours est-il que je ne comprend pas l'incohérence du comportement.

aro a écrit:Si, il y a du code intermédiaire puisque tu appelles des méthodes du modèle avant d'afficher. Et, pas celle qui lui donne un tableau de booléens pour le nouvel état mais celles pour changer le nombre de lignes et de colonnes...

En faite comme je modifie le nombre de ligne et colonne, le model va prévenir les observateur de la modification et donc dans ma classe MainView, dans le notifierChangement() je fais la mise à jour du board :

Code:

  public void notifieChangement() {
        http://System.out.println("Debug : Passe par notifier changement LifeGameMainView");
        http://boardLedClickable.reSize(getModel().getNbLines(), getModel().getNbColumns());
        boardLedClickable.setState(getModel().getTab2dCellules());
        System.out.println("Debug : Passe par notifier changement LifeGameMainView Aff");
        boardLedClickable.affiche();
    }

Qui d'ailleur m'affiche aussi que des Falses Sad

Aftab007

Nombre de messages : 85
Age : 28
Prénom : Aftab
Date d'inscription : 27/11/2008

Revenir en haut Aller en bas

resolu Re: [ALG3ir-Java] Projet 1 - Serialization

Message  aro le Dim 25 Nov 2012, 14:22

Aftab007 a écrit:En faite comme je modifie le nombre de ligne et colonne, le model va prévenir les observateur de la modification et donc dans ma classe MainView, dans le notifierChangement() je fais la mise à jour du board :

Code:

  public void notifieChangement() {
        http://System.out.println("Debug : Passe par notifier changement LifeGameMainView");
        http://boardLedClickable.reSize(getModel().getNbLines(), getModel().getNbColumns());
        boardLedClickable.setState(getModel().getTab2dCellules());
        System.out.println("Debug : Passe par notifier changement LifeGameMainView Aff");
        boardLedClickable.affiche();
    }

Qui d'ailleur m'affiche aussi que des Falses Sad
Parce que tu affiches après le setState qui modifie à partir de l'état du modèle. Or, le modèle n'a jamais reçu l'état récolté du fichier.

aro

Nombre de messages : 557
Prénom : Anne
Statut : Prof
Date d'inscription : 06/09/2008

Revenir en haut Aller en bas

resolu Re: [ALG3ir-Java] Projet 1 - Serialization

Message  Aftab007 le Mer 28 Nov 2012, 14:43

Problem solved Ok super, en prenant compte vos explications sa marche super bien :-D

Merci bien pour vos lumières Smile bom

Aftab007

Nombre de messages : 85
Age : 28
Prénom : Aftab
Date d'inscription : 27/11/2008

Revenir en haut Aller en bas

resolu Re: [ALG3ir-Java] Projet 1 - Serialization

Message  Contenu sponsorisé Aujourd'hui à 08:47


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