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 :

probleme acces objet/classe


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 12
    Par défaut probleme acces objet/classe
    Bonjour, je suis débutant en Java et je n'arrive pas à comprendre pourquoi monMenu ne peut utiliser setGame()....Si quelqu'un pouvait m'expliquer comment faire. Merci.

    Fichier : Fenetre.java
    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
    public class Fenetre extends JFrame 
    {
     private Menu monMenu = new Menu();
     
     public Fenetre () 
     {
        this.setJMenuBar(monMenu);
        this.setVisible(true);
     }
     
     public void setGame()
     {
       System.out.println("TEST");
     }
    }
    Fichier: Menu.java
    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
    public class Menu extends JMenuBar {
     private JMenu test1 = new JMenu("Fichier");
     private JMenuItem item1 = new JMenuItem("Nouveau");
     
     public Menu()
     {
       this.test1.add(item1);
     
       item1.addActionListener(new ActionListener(){
    	public void actionPerformed(ActionEvent arg0) {
    		Fenetre.setGame();
    	}				
       });
     
       this.add(test1);
     }
    }

  2. #2
    Membre expérimenté Avatar de hydraland
    Profil pro
    Développeur Java
    Inscrit en
    Mai 2006
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mai 2006
    Messages : 179
    Par défaut
    Salut,

    Premièrement il faut mettre ton code dans la balise code pour qu'il soit plus lisible.
    Pour répondre à ta question la méthode setGame n'est pas static donc ne peut être appelé comme cela Fenetre.setGame(). Dans ton cas il faut passer à ton menu une instance de fenêtre pour qu'il puisse utiliser la méthode setGame.

    PS : Je te conseille de faire des exemples plus simple pour comprendre les mécanisme de base de Java avant de te lancer dans des IHM.

    A+
    Hydraland

  3. #3
    Membre émérite
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 764
    Par défaut
    Tout d'abord, pense à utiliser les balises [code] quand tu postes, ça sera plus lisible.

    Concernant ton problème : tu appelles la méthode de manière statique alors qu'elle n'est pas statique, et donc que tu devrais l'appeler uniquement sur une instance de type Fenetre.



    Un champ statique ou une méthode statique ne dépend d'aucune instance.
    Par exemple, si tu appelles Math.PI ou Math.cos(35), tu n'as pas besoin d'utiliser un objet de type Math pour que ces instructions aient du sens (d'ailleurs tu aurais du mal à en construire un puisque Math n'offre aucun constructeur...).

    Un champ ou une méthode d'instance dépendent d'une instance donnée. Supposons par exemple que tu ajoutes le constructeur suivant à ta class Fenetre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public Fenetre (boolean visible) {
       this.setVisible(visible);
    }
    Alors, en appelant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Fenetre fenetre1 = new Fenetre(true);
    Fenetre fenetre2 = new Fenetre(false);
    tu obtiens deux instances de la classe Fenetre, fenetre1 et fenetre2, dont les états internes sont différents puisque l'une est "visible" et l'autre non.
    Définissons deux méthodes dans la classe Fenetre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public static void testStatique() {
       System.out.println("Cette information indépendante de l'instance.")
    }
    public void testDInstance() {
       System.out.println("Cette information dépend de l'instance : visible="+this.isVisible());
    }
    Dans la première méthode, je n'utilise aucune information spécifique à une instance donnée, c'est pourquoi je peux la définir comme une méthode statique grâce au mot-clé static. Dans la deuxième méthode, on utilise des informations sur l'état interne d'une instance de Fenetre, c'est pourquoi je l'ai définie comme une méthode d'instance (d'ailleurs le compilateur refuserait de la définir comme statique).
    La première méthode peut (et doit) alors être utilisée sans aucune référence à une instance donnée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Fenetre.testStatique();
    // affichage : "Cette information indépendante de l'instance."
    La deuxième méthode doit faire référence à une instance donnée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Fenetre.testDInstance();
    // impossible ! comment saurait-on ce que vaut "visible" ???
     
    fenetre1.testDInstance();
    // affichage : "Cette information dépend de l'instance : visible=true"
    fenetre2.testDInstance();
    // affichage : "Cette information dépend de l'instance : visible=false"

    Voilà, j'espère avoir pu t'aider à mieux comprendre les notions de statique / non statique



    Maintenant, comment concrètement corriger ton problème... c'est à toi de voir.
    La méthode setGame() n'est manifestement pas encore codée pour de vrai, je n'ai donc aucune idée de ce qu'elle devrait faire et donc de la bonne manière de l'utiliser.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 12
    Par défaut
    Merci beaucoup...franchement c'est super...;;

    La réponse est plus que complète..à bientôt!

  5. #5
    Membre émérite
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 764
    Par défaut
    Attention, le bouton "MP" c'est pour les messages privés

    Je copie le message :
    Citation Envoyé par nnj46
    En fait, la méthode setGame() je comptais l'utiliser afin de changer le setContentPane via mon menu mais je ne sais pas si c'est la bonne solution..

    Merci beaucoup pour l'explication Statique / non-Statique.

    je pense faire dans ma classe Fenetre()

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public void setGame( Panneau map )
    {
            this.setContentPane(map);
    }
    et dans la classe Menu()

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    item1.addActionListener(new ActionListener(){
    			public void actionPerformed(ActionEvent arg0) {
                                    Fenetre fenetre1 = new Fenetre(); 
    				fenetre1.setGame(map1);
    			}				
    });
    Merci beaucoup pour la réponse apportée..c'est vraiment très simpa je commencais à m'embrouiller avec toutes ces classes et je ne sais jamais où déclarer chaque objet tout devient fouilli..

    cependant un grand dilemne persiste..
    l'objet monMenu est créé dans la classe Fenetre et je pense que le compilateur ne va pas aimer si je déclare fenetre1 dans le dit Menu.
    Fenetre.java
    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
     
    import javax.swing.*;
     
    public class Fenetre extends JFrame {
     
    	private Menu monMenu = new Menu();
    	private Panneau acceuil = new Panneau();
    	private Carte laCarte = new Carte();
     
     
    	//  GESTION DES DEPLACEMENTS (COUPLE AVEC LA GESTION DES EVENEMENTS CLAVIER) :
    	private Deplacement unDeplacement = new Deplacement(laCarte);
    	private GestionnaireEvenements gEvenement = new GestionnaireEvenements(unDeplacement); 
     
     
    	public static int NB_TROUVE = 0;
     
     
    	//  POSITION ET DIMENSION DE LA FENETRE :
    	public static final int POSITION_FENETRE_X = 400;
    	public static final int POSITION_FENETRE_Y = 300;
    	public static final int TAILLE_FENETRE_X = Carte.P_LARGEUR+9;
    	public static final int TAILLE_FENETRE_Y = Carte.P_HAUTEUR+58;
     
    	// TITRE DE LA FENETRE :
    	public static final String TITRE = "SoKoBan";
     
    	public Fenetre () 
    	{
     
    		// Definition générale de la fenetre : 
    		this.setTitle(TITRE);
    		this.setSize(TAILLE_FENETRE_X, TAILLE_FENETRE_Y);
    		this.setLocation(POSITION_FENETRE_X,POSITION_FENETRE_Y);
    		this.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
     
    		// Mise en place du menu :		
    		this.setJMenuBar(monMenu);
     
     
    		// On rajoute les éléments (pour l'instant que la carte 1) :
    		this.setContentPane(acceuil);
     
     
    		this.setVisible(true);
     
    		// On ajoute la gestion des évenements : 
    		this.addKeyListener(gEvenement);
     
    	}
     
    	public void setGame()
    	{
    		System.out.println("TEST");
    		this.setContentPane(laCarte);
    	}
    }
    et Menu.java
    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
     
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
     
    import javax.swing.*;	
     
    public class Menu extends JMenuBar {
     
    	//CREATION DES OBJETS DU MENU
    	private JMenu test1 = new JMenu("Fichier");
    	private JMenu test2 = new JMenu("Edition");
     
    	private JMenuItem item1 = new JMenuItem("Nouveau");	
    	private JMenuItem item2 = new JMenuItem("Ouvrir");
    	private JMenuItem item3 = new JMenuItem("Fermer");
    	private JMenuItem item4 = new JMenuItem("Annuler");
    	private JMenuItem item5 = new JMenuItem("Recommencer");
     
    	public Menu()
    	{
    		this.test1.add(item1);
    		this.test1.add(item2);	
    		this.test1.add(item3);
     
    		item3.addActionListener(new ActionListener(){
    			public void actionPerformed(ActionEvent arg0) {
    				System.exit(0);
    			}				
    		});
     
    		item4.addActionListener(new ActionListener(){
    			public void actionPerformed(ActionEvent arg0) {		
     
    			}				
    		});
     
    		item5.addActionListener(new ActionListener(){
    			public void actionPerformed(ActionEvent arg0) {
                                    Fenetre fenetre1 = new Fenetre();
    				fenetre1.setGame();
    			}				
    		});
     
     
    		test2.add(item4);
    		test2.add(item5);
     
                    this.add(test1);
    		this.add(test2);
    	}
     
    }

Discussions similaires

  1. [V6] Paramétrer l'accès aux classes/objets dans l'univers
    Par kiralina dans le forum Designer
    Réponses: 4
    Dernier message: 11/12/2012, 17h24
  2. Accés objet d'une autre classe
    Par lejeanbon dans le forum AWT/Swing
    Réponses: 8
    Dernier message: 04/05/2008, 15h59
  3. Réponses: 2
    Dernier message: 01/06/2007, 08h57
  4. [Visual C++6] Accès à une classe d'une dll
    Par charliejo dans le forum MFC
    Réponses: 12
    Dernier message: 09/03/2005, 16h48
  5. Objets/Classes avec un SGBD
    Par tiboleo dans le forum Décisions SGBD
    Réponses: 13
    Dernier message: 09/11/2003, 16h04

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