IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Java Discussion :

Portée d'instance de classe.


Sujet :

Java

  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2013
    Messages : 88
    Par défaut Portée d'instance de classe.
    Bonsoir tout le monde !

    Je suis sur un petit projet et j'ai quelques questions pour lesquelles je n'arrive pas à trouver la solution ...

    J'ai une classe StrategoBackground dans laquelle je fais plusieurs réglages de fenêtre, de composants etc ...
    Via cette classe, je peut créer une nouvelle fenêtre NewGameFrame proposant un nouveau jeu au joueur.
    Cette classe (NewGameFrame) appelle une méthode randomizePiecesPositions d'une autre classe (PlacePieces), forcément, cette méthode intervient sur les attributs de la classe StrategoBackground pour y place des pions.

    Lors de l'appel de NewGameFrame dans Stratego Background :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public class StrategoBackground extends JFrame{
    private void newGameActionPerformed(ActionEvent e){
    NewGameFrame newGameFrame = new NewGameFrame(this);
    }
    }
    Je passe l'instance courante afin de garder tout les attributs.

    Dans la classe NewGameFrame :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    public class NewGameFrame extends JFrame{
    StrategoBackground stb; 	
     
    	public NewGameFrame(StrategoBackground stb){		
    		this.stb = stb; 
    		initComponents(this.stb); 
    	}
     
    	private void playActionPerformed(ActionEvent e){		
    		// TODO : Methode de random des pions. 
    		PlacePieces pp = new PlacePieces(this.stb); 
    		if(randomize.isSelected())
    			pp.randomizePiecesPositions(); 		
    	}
    }
    Je garde donc l'instance courante de StrategoBackground.

    Et enfin, dans PlacePieces :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    public class PlacePieces 
    {	
    	StrategoBackground stb; 
    	public PlacePieces(StrategoBackground stb){
    		this.stb = stb; 
    	}
     
          public void randomizePiecesPositions(){		
    		JLabel battleBackground = stb.getBattleBackground();
    		Pions tabPions[][] = new Pions[10][10]; 
     
    		for(int l = 0 ; l < 10 ; l++)
    		{
    			for(int c = 0 ; c < 10 ; c++)
    			{
    				/*Creation du tableau de Pions*/
    			}	
    		}
     
    		//stb.setTabButtons(tabPions); 
    	 	stb.setBattleBackground(battleBackground); 
    		System.out.println("ICI : " +stb.getTest());
    	}
    }
    Je n'arrive pas au résultat escompter.

    D'ou viens la perte de mes informations de l'instance courante de StrategoBackground ?

    A noter que si j'appele la méthode randomizePiecesPosition *depuis* StrategoBackground, tout fonctionne ...

    Des idées ?

  2. #2
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Il n'y a pas de perte d'information. Es-tu sur que newGameActionPerformed et playActionPerformed sont bien appelés?

  3. #3
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2013
    Messages : 88
    Par défaut
    Oui, toutes les deux sont appelées via un actionListener :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    public class NewGameFrame extends JFrame
    {
       /*Bla bla bla */
                          play.addActionListener(new ActionListener(){			
    			@Override
    			public void actionPerformed(ActionEvent e) {
    				playActionPerformed(e); 				
    			}
    		});
    }
    Et :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    public class StrategoBackground extends JFrame
    {
                            newGame.addActionListener(new ActionListener() {			
    			@Override
    			public void actionPerformed(ActionEvent e) {
    				newGameActionPerformed(e);
    			}
    		});
    }
    Je dois dire que je suis un peu perdu ...

  4. #4
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    je demande la confirmation qu'on est rentré dedans (System.out.println par exemple). Je peux mettre beaucoup de chose dans des actionListeners qui ne seront jamais appelé

  5. #5
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2013
    Messages : 88
    Par défaut
    Ah sorry

    Oui, j'entre bien dedans en mettant à chaque fois un sysout (dans les deux):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     play.addActionListener(new ActionListener(){			
    			@Override
    			public void actionPerformed(ActionEvent e) {
    				playActionPerformed(e); 
    				System.out.println("Play Action Performed"); 
    			}
    		});
    Ainsi que dans la méthode elle-même (dans les deux aussi) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    private void newGameActionPerformed(ActionEvent e)
    	{
    		// TODO 
    		NewGameFrame newGameFrame = new NewGameFrame(this); 
    		System.out.println("New Game"); 
    	}

  6. #6
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Ok, a chaque niveau de tes appels (création des listeners, enregistrement des listener, appel des listener, appel des méthodes dans par les listeners), tu peux afficher la valeur de StrategoBackground ? Histoire qu'on découvre à quel endroit tu mixe les deux.

    Es-tu sur de ne pas faire un new StrategoBackground quelque part?

  7. #7
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2013
    Messages : 88
    Par défaut
    Afficher la valeur de Strategobackgroung = un simple sysout ?
    Edit : En simple sysout :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    public class StrategoBackground extends JFrame
    {
    newGame.addActionListener(new ActionListener() {			
    			@Override
    			public void actionPerformed(ActionEvent e) {
    				newGameActionPerformed(e);
    				System.out.println("Appel 0 : " +this);
    			}
    		});
     
            private void newGameActionPerformed(ActionEvent e)
    	{
    		// TODO 
    		System.out.println("Appel 1 : " +this);
    		NewGameFrame newGameFrame = new NewGameFrame(this); 
    		this.player1Name = newGameFrame.getPlayer1Name(); 
    		this.player2Name = newGameFrame.getPlayer2Name(); 
    	}
    }
    Et dans NewGameFrame :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    private void playActionPerformed(ActionEvent e)
    {
    StrategoBackground stb; 	
     
    	public NewGameFrame(StrategoBackground stb){		
    		this.stb = stb; 
    		initComponents(this.stb); 
    	}
    		// Todo : Quitter quand on a fini avec cette fenetre. 
    		this.player1Name = (String) player1Tf.getText(); 
    		this.player2Name = (String) player2Tf.getText();
     
     
    		// TODO : Methode de random des pions. 
    		PlacePieces pp = new PlacePieces(this.stb); 
    		if(randomize.isSelected())
    			pp.randomizePiecesPositions();
    		System.out.println("Appel 2 : " +this.stb);
     
     
    		//else
    		//	pp.placePiecesFromPlayerChoice(); 
     
    	}
    Resultat console :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Appel 1 : be.stratego.gui.StrategoBackground[frame0,617,345,1206x788,invalid,layout=java.awt.BorderLayout,title=Stratego,normal,defaultCloseOperation=EXIT_ON_CLOSE,rootPane=javax.swing.JRootPane[,3,25,1200x760,invalid,layout=javax.swing.JRootPane$RootLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=16777673,maximumSize=,minimumSize=,preferredSize=],rootPaneCheckingEnabled=true]
    Appel 0 : be.stratego.gui.StrategoBackground$2@5e32007f
    ICI : LALA
    Appel 2 : be.stratego.gui.StrategoBackground[frame0,617,345,1206x788,invalid,layout=java.awt.BorderLayout,title=Stratego,normal,defaultCloseOperation=EXIT_ON_CLOSE,rootPane=javax.swing.JRootPane[,3,25,1200x760,invalid,layout=javax.swing.JRootPane$RootLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=16777673,maximumSize=,minimumSize=,preferredSize=],rootPaneCheckingEnabled=true]
    Donc, c'est apparemment la même ...

  8. #8
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Si tu n'y a pas surchargé toString, oui, ça donnera un truc du style

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    System.out.println("avant play.addActionListener(new ActionListener(): "+this.stb);
                          play.addActionListener(new ActionListener(){			
    			@Override
    			public void actionPerformed(ActionEvent e) {
    				System.out.println("Avant Play Action Performed: "+stb); 
    				playActionPerformed(e); 		
    				System.out.println("Après Play Action Performed: "+stb); 		
    			}
    		});
    ca donnera des truc du style:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    avant play.addActionListener(new ActionListener(): StrategoBackground@12AB34

  9. #9
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2013
    Messages : 88
    Par défaut
    Remarque :

    Quand je fais l'appel dans la classe PlacePieces, les appels se font correctement, mais pas du tout dans le bon ordre ...

    J'ai :
    Appel 1 - Appel 0 - Appel 3 - Appel 2

    Edit : C'était de ma faute, c'est régler.

    Mais néanmoins, les StrategoBackground renvoyés sont les mêmes ...

  10. #10
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2013
    Messages : 88
    Par défaut
    Mais je n'ai pas d'appel 5, dans StrategoBackgound :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    private void newGameActionPerformed(ActionEvent e)
    	{
    		// TODO 
    		System.out.println("Appel 1 : " +this);
    		NewGameFrame newGameFrame = new NewGameFrame(this); 
    		System.out.println("Appel 5 : "+this);
    		this.player1Name = newGameFrame.getPlayer1Name(); 
    		this.player2Name = newGameFrame.getPlayer2Name(); 
    	}
    Edit : Si en fait ...

  11. #11
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2013
    Messages : 88
    Par défaut
    Tout con ...

    Il suffisait de rajouter un biesse .pack() dans randomizePositions ...

    Quoi qu'il en soit, un tout tout grand merci du temps que tu m'as consacré

  12. #12
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    le pack() n'est pas indispensable. Je pensais pas que tu modifiais des composant swing directement. Quand to modifie un conteneur visible (ajout/suppression d'éléments dedans), il faut appeler revalidate() dessus après

  13. #13
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2013
    Messages : 88
    Par défaut
    Tiens, je ne connaissais pas ça ! Bon à savoir

    Tout grand merci chef

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 13
    Dernier message: 04/07/2011, 17h13
  2. Exporter une instance de classe au format XML ou XMI
    Par Scorpion Rouge dans le forum Persistance des données
    Réponses: 2
    Dernier message: 22/12/2005, 11h19
  3. Réponses: 2
    Dernier message: 09/10/2005, 15h35
  4. Instance de classes
    Par KymZen dans le forum Tkinter
    Réponses: 9
    Dernier message: 07/04/2005, 08h35
  5. Conditions de destruction des instances de classes
    Par elvivo dans le forum Général Python
    Réponses: 4
    Dernier message: 29/12/2004, 17h16

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo