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

avec Java Discussion :

Problème accès méthode d'une autre classe


Sujet :

avec Java

  1. #1
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2013
    Messages : 5
    Points : 2
    Points
    2
    Par défaut Problème accès méthode d'une autre classe
    Bonjour,

    Je suis nouveau sur le forum, et je viens vers vous avec un petit problème...
    Après avoir cherché sur plusieurs sites et forums, je ne trouve pas de réponse claire...

    Je vais essayer d'être clair.

    Voici ce que j'ai:
    - Une classe frame (qui contiendra en altérnance le Panel1 ou le Panel 2);
    - Une classe Panel1 (qui contient un bouton qui permet d'afficher le Panel2);
    - Une classe Panel2 (qui contient un bouton qui permet de réafficher le Panel1);

    Le but du programme c'est d'avoir une jframe qui contient le Panel1 au départ et que quand on appuie sur un bouton, le Panel1 devient "visible(false)" et que le Panel2 prenne sa place.
    Puis quand on appuie sur le bouton du Panel2, le Panel2 disparait, et on réaffiche le Panel1 du début (Visible(true)).

    Mais voilà, je n'arrive pas à appeler les méthodes qui sont dans la classe frame et qui permettent de faire tout ça.

    Pour illlustrer mon problème, je vous donne des bouts de code:

    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 frame extends JFrame{
     
    	Panel1 panel1 = new Panel1();
    	Panel2 panel2;
     
    	public frame(){	
    		this.setContentPane(panel1);
    	}
     
    	public void Aff2(){
    		this.panel1.setvisible(false);
    		panel2 = new Panel2();
    		this.setContentPane(panel2);
    	}
     
    	public void Aff1(){
    		this.getContentPane.remove(panel2);
    		this.panel1.setVisible(true);
    	}
    }

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public class Panel1 extends JPanel{
    	frame f;
     
    	public Panel1(){
    		JButton bouton1 = new JButton();
    		bouton1.AddMouselistener(new MouseAdapter() {
    			public void MouseClicked(MouseEvent evt){
    				f.Aff2();		// C'EST ICI QUE CA POSE PROBLEME!!!
    			}
    		});
    	}
    }

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public class Panel2 extends JPanel{
    	frame f;
     
    	public Panel2(){
    		JButton bouton2 = new JButton();
    		bouton2.AddMouselistener(new MouseAdapter() {
    			public void MouseClicked(MouseEvent evt){
    				f.Aff1();		// C'EST ICI QUE CA POSE PROBLEME!!!
    			}
    		});
    	}
    }


    C'est la façon d'appeler mes méthodes dans "frame" qui n'est pas bonne...


    Merci pour votre aide!!!

  2. #2
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2013
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2013
    Messages : 75
    Points : 138
    Points
    138
    Par défaut
    Je pense que la tu mix 2 chose d'un coté tu cache panel1 et de l'autre tu enlève ou tu créer panel2.

    Je pense que a la création de frame tu créer les deux panels et tu cache panel2.
    Quand tu clique sur le bouton tu cache panel1 et tu montre panel2.

    Ensuite pour récupère la frame tu fait un this.getParent().

  3. #3
    Membre éprouvé Avatar de Grom61736
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2013
    Messages
    169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Février 2013
    Messages : 169
    Points : 1 144
    Points
    1 144
    Par défaut
    Tout d'abord, avoir une instance de "frame" dans ton JPanel n'est, selon moi, pas une bonne chose.

    J'aurais plutôt fait dans ta classe frame
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    panel1.getButton1.AddMouselistener(new MouseAdapter() {
                 public void MouseClicked(MouseEvent evt){
                        Aff2();
                   }
    });
    Deuxièmement, quel est le problème exactement, le panel ne change pas ou c'est le retour du panel2 au panel1 ?

  4. #4
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 312
    Points : 533
    Points
    533
    Par défaut
    Bonjour,

    Je viens d'essayer getParent() mais sauf erreur de ma part, ça ne fonctionne pas car getParent() retourne un objet Container qui ne contient donc pas les methodes Aff1() et Aff2()?????

    Sinon une autre méthode consiste à passer frame en parametre de Panel1 et Panel2 :

    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
    import javax.swing.*;
     
    public class frame extends JFrame{
     
    	Panel1 panel1 = new Panel1(this);
    	Panel2 panel2 = new Panel2(this);
     
    	public frame(){	
    		this.setContentPane(panel1);
    		setSize(400,400);
    		setVisible(true);
    	}
     
    	public void Aff2(){
    		panel1.setVisible(false);
    		panel2.setVisible(true);
    		this.setContentPane(panel2);
    	}
     
    	public void Aff1(){
    		panel2.setVisible(false);
    		panel1.setVisible(true);
    		this.setContentPane(panel1);
    	}
     
    	public static void main(String[] args) {
    		frame ff = new frame();
    	}
    }
    puis Panel1:

    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
    import javax.swing.*;
    import java.awt.event.*;
    import java.awt.*;
     
     
    public class Panel1 extends JPanel implements ActionListener{
    	frame f;
     
    	public Panel1(frame f){
    		this.f = f;
    		setBackground(Color.blue);
    		JButton bouton1 = new JButton("bouton1");
    		bouton1.addActionListener(this);
    		add(bouton1);
    	}
     
    	public void actionPerformed(ActionEvent e) {
    		f.Aff2();
    	}
    }
    enfin Panel2:

    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
    import javax.swing.*;
    import java.awt.event.*;
    import java.awt.*;
     
    public class Panel2 extends JPanel implements ActionListener{
    	frame f;
    	public Panel2(frame f){
    		this.f = f;
    		setBackground(Color.red);
    		JButton bouton2 = new JButton("bouton2");
    		add(bouton2);
    		bouton2.addActionListener(this);
    	}
    	public void actionPerformed(ActionEvent e) {
    	f.Aff1();	
    	}
    }

  5. #5
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2013
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par Grom61736 Voir le message
    Tout d'abord, avoir une instance de "frame" dans ton JPanel n'est, selon moi, pas une bonne chose.

    J'aurais plutôt fait dans ta classe frame
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    panel1.getButton1.AddMouselistener(new MouseAdapter() {
                 public void MouseClicked(MouseEvent evt){
                        Aff2();
                   }
    });
    Deuxièmement, quel est le problème exactement, le panel ne change pas ou c'est le retour du panel2 au panel1 ?

    Le Panel1 s'affiche bien au départ, mais le problème c'est que quand j'appuye sur le bouton1 il met un NullPointerException...

    Mais je vais essayer ta solution, et je te dis quoi après ;-)
    Et j'essayerai la solution de ludomacho si ça ne va pas ;-)

    Merci

  6. #6
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 312
    Points : 533
    Points
    533
    Par défaut
    La methode de Grom61736 me semble effectivement plus propre par contre je suis obligé de déclarer bouton1 et getBouton1() en static car utilisé ensuite dans actionPerformed() et là je veux bien une explication????

    revoici le code adapté avec les conseils de Grom61736 :

    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
    import javax.swing.*;
    import java.awt.event.*;
     
    public class frame extends JFrame implements ActionListener{
     
    	Panel1 panel1 = new Panel1();
    	Panel2 panel2 = new Panel2();
     
    	public frame(){	
    		this.setContentPane(panel1);
    		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		setSize(400,400);
    		panel1.bouton1.addActionListener(this);
    		panel2.bouton2.addActionListener(this);
    		setVisible(true);
    	}
     
    	public void Aff2(){
    		panel1.setVisible(false);
    		panel2.setVisible(true);
    		this.setContentPane(panel2);
    	}
     
    	public void Aff1(){
    		panel2.setVisible(false);
    		panel1.setVisible(true);
    		this.setContentPane(panel1);
    	}
     
    	public static void main(String[] args) {
    		frame ff = new frame();
    	}
     
    	public void actionPerformed(ActionEvent e) {
    		if (e.getSource().equals(Panel1.getBouton()))
    			Aff2();
    		else
    			Aff1();
    	}
    }
    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
     
    import javax.swing.*;
    import java.awt.*;
     
     
    public class Panel1 extends JPanel{
     
    	static JButton bouton1 = new JButton("bouton1");
     
    	public Panel1(){
    		setBackground(Color.blue);
    		add(bouton1);
    	}
    	public static JButton getBouton() {
    		return bouton1;	
    	}
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    import javax.swing.*;
    import java.awt.*;
     
    public class Panel2 extends JPanel {
     
    	JButton bouton2 = new JButton("bouton2");	
     
    	public Panel2(){
    		setBackground(Color.red);
    		add(bouton2);
    	}
    }

  7. #7
    Nouveau membre du Club
    Inscrit en
    Juin 2010
    Messages
    74
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 74
    Points : 31
    Points
    31
    Par défaut
    bon je te donne 3 classe une classe fenetre et deux classe panneau
    la fentre :
    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
    58
    59
    60
    61
    62
    63
    64
    import java.awt.Component;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import javax.swing.JButton;
    import javax.swing.JFrame;
     
    /**
     *
     * @author Taima-info
     */
    public class Fen extends JFrame{
        JButton b1;
        JButton b2;
        Pan1 p1;
        Pan2 p2;
        public Fen(){
            this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            this.setLayout(null);
            this.setBounds(0, 0, 400, 400);
            this.setTitle("exo");
            b1=new JButton("pan1");
            b1.setBounds(100, 310, 100, 30);
            b1.addActionListener(new ActionListener() {
     
                @Override
     
                public void actionPerformed(ActionEvent e) {
                    p1 =new Pan1();
                    addComponent(p1);
     
                    b1.setEnabled(false);
                    b2.setEnabled(true);
                    p1.repaint();
                }
            });
            b2=new JButton("pan2");
            b2.setBounds(200, 310, 100, 30);
            b2.addActionListener(new ActionListener() {
     
                @Override
                public void actionPerformed(ActionEvent e) {
                    p2 =new Pan2();
                    addComponent(p2);
                    //p1.setVisible(false);
                    b2.setEnabled(false);
                    b1.setEnabled(true);
                    p2.repaint();
                }
            });
     
            this.add(b1);
            this.add(b2);
        }
      public void addComponent(Component com){
          this.getContentPane().add(com);
      }
        /**
         * @param args the command line arguments
         */
        public static void main(String[] args) {
            // TODO code application logic here
            new Fen().setVisible(true);
        }
    }
    la classe pan1:
    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
    import java.awt.Color;
    import javax.swing.JButton;
    import javax.swing.JPanel;
     
    /**
     *
     * @author Taima-info
     */
    public class Pan1 extends JPanel{
     
        public Pan1(){
     
     
            this.setBounds(0, 0, 400, 300);
            this.setBackground(Color.green);
        }
    }
    la classe pan2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    import java.awt.Color;
    import javax.swing.JPanel;
     
    /**
     *
     * @author Taima-info
     */
    public class Pan2 extends JPanel{
     
        public Pan2(){
            this.setBounds(0, 0, 400, 300);
            this.setBackground(Color.red);
        }
    }

  8. #8
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2013
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par ludomacho Voir le message
    La methode de Grom61736 me semble effectivement plus propre par contre je suis obligé de déclarer bouton1 et getBouton1() en static car utilisé ensuite dans actionPerformed() et là je veux bien une explication????

    revoici le code adapté avec les conseils de Grom61736 :

    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
    import javax.swing.*;
    import java.awt.event.*;
     
    public class frame extends JFrame implements ActionListener{
     
    	Panel1 panel1 = new Panel1();
    	Panel2 panel2 = new Panel2();
     
    	public frame(){	
    		this.setContentPane(panel1);
    		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		setSize(400,400);
    		panel1.bouton1.addActionListener(this);
    		panel2.bouton2.addActionListener(this);
    		setVisible(true);
    	}
     
    	public void Aff2(){
    		panel1.setVisible(false);
    		panel2.setVisible(true);
    		this.setContentPane(panel2);
    	}
     
    	public void Aff1(){
    		panel2.setVisible(false);
    		panel1.setVisible(true);
    		this.setContentPane(panel1);
    	}
     
    	public static void main(String[] args) {
    		frame ff = new frame();
    	}
     
    	public void actionPerformed(ActionEvent e) {
    		if (e.getSource().equals(Panel1.getBouton()))
    			Aff2();
    		else
    			Aff1();
    	}
    }
    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
     
    import javax.swing.*;
    import java.awt.*;
     
     
    public class Panel1 extends JPanel{
     
    	static JButton bouton1 = new JButton("bouton1");
     
    	public Panel1(){
    		setBackground(Color.blue);
    		add(bouton1);
    	}
    	public static JButton getBouton() {
    		return bouton1;	
    	}
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    import javax.swing.*;
    import java.awt.*;
     
    public class Panel2 extends JPanel {
     
    	JButton bouton2 = new JButton("bouton2");	
     
    	public Panel2(){
    		setBackground(Color.red);
    		add(bouton2);
    	}
    }
    Voilà, j'ai essayé, ça fonctionne, merci beaucoup...
    Mais en fait j'aurais bien voulu que le Panel2 ne soit crée que quand on clique sur le bouton et donc pas à l'avance...
    Donc on fait un panel2 = new Panel2(); que quand on clique et pas quand un lance la frame...

    Mais dans ce cas là, j'ai un NullPointerException vu qu'il n'y a pas d'instance de la classe...

    Quelqu'un a une idée?

    Merci :-)

  9. #9
    Nouveau membre du Club
    Inscrit en
    Juin 2010
    Messages
    74
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 74
    Points : 31
    Points
    31
    Par défaut salut
    essayer mon code peut etre t'aide

  10. #10
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2013
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par riyad25h Voir le message
    essayer mon code peut etre t'aide
    J'ai regardé ton code, mais le problème c'est que moi les bouton doivent être dans les panels que j'affiche et pas dans la frame même... :s

  11. #11
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2013
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    J'ai finalement trouvé la solution avec vos différentes idées:

    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
    Public class frame extends JFrame{
     
    	Panel1 panel1 = new Panel1();
    	Panel2 panel2;
     
    	public frame(){	
    		this.setContentPane(panel1);
    		panel1.getbouton1().AddMouselistener(new MouseAdapter() {
    			public void MouseClicked(MouseEvent evt){
    				Aff2();
    			}
    		});
    	}
     
    	public void Aff2(){
    		panel1.setvisible(false);
    		panel2 = new Panel2();
    		setContentPane(panel2);
    		panel2.getbouton2().AddMouselistener(new MouseAdapter() {
    			public void MouseClicked(MouseEvent evt){
    				Aff1();
    			}
    		});
    	}
     
    	public void Aff1(){
    		panel2.setVisible(false);
    		panel1.setVisible(true);
    		setContentPane(panel1);
    	}
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public class Panel1 extends JPanel{
     
    	public Panel1(){
    		JButton bouton1 = new JButton("bouton1");
    	}
    }

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public class Panel2 extends JPanel{
     
    	public Panel2(){
    		JButton bouton2 = new JButton("bouton2");
    	}
    }

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 03/02/2012, 17h15
  2. Appel d'une méthode d'une autre classe à partir d'un actionListener
    Par bisouJava dans le forum Débuter avec Java
    Réponses: 4
    Dernier message: 31/10/2011, 09h05
  3. Exécuter une méthode d'une autre classe
    Par guillaume17 dans le forum Débuter avec Java
    Réponses: 15
    Dernier message: 25/06/2008, 12h15
  4. Accés objet d'une autre classe
    Par lejeanbon dans le forum AWT/Swing
    Réponses: 8
    Dernier message: 04/05/2008, 15h59
  5. Problème pour appeler une méthode d'une autre classe
    Par tse_tilky_moje_imja dans le forum Général Python
    Réponses: 7
    Dernier message: 03/03/2006, 13h33

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