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 :

Je ne comprends pas la méthode "actionPerformed"


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de tarpal
    Homme Profil pro
    Ingénieur Electronique retraité
    Inscrit en
    Février 2016
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur Electronique retraité
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2016
    Messages : 70
    Par défaut Je ne comprends pas la méthode "actionPerformed"
    Bonjour à tous,
    ça fait un moment que je tourne sur les tutos et les FAQs et je ne trouve toujours la solution à mon problème.
    C'est pourquoi je me décide à vous demander de l'aide.
    Dans le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public class Traitementbut1 implements ActionListener
           {
        	 public void actionPerformed(ActionEvent e)
             {
    		// JE SOUHAITE APPELER LA CLASS " PanneauTest.java" ICI
            // ET JE N'Y ARRIVE PAS !!!
     
            // Vérification du fonctionnement du bouton but1
            System.out.println(" J'ai cliqué sur boutton Charger Image  !");
             }
     
            }
    J'ai mis ce code dans une class, et j'ai bien en console le message " J'ai cliqué sur boutton Charger Image"
    Sur tous les exemples et tutos que j'ai trouvé, nous faisons toujours référence à la console.
    Ne peut-on pas faire autre chose que d'écrire dans une console ???
    Je souhaite appeler une class avec " actionPerformed" et je n'y arrive pas.
    Mon message sur console ne me sert que pour vérifier que mon boutton est bien configuré et que ma fonction marche bien ( c'est tout )
    Où puis-je trouver des tutos ou cours dans lequel on apprends à appeler une class ?
    Merci de votre aide.
    Si besoin je peux vous poster les codes de mes trois modules
    Main
    Fenêtre
    Panneau
    Comme c'est un peu lourd, l'info me suffirait de savoir où chercher
    Merci à vous

  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
    On n'appelle pas une classe, on l'instancie. Et pour ça, on utilise le constructeur new NomDeLaClass(parametres). La seule chose que tu peux appeler, ce sont des méthodes. Pour faire ça, on utilise uneInstance.uneMethode(desParametres).

    Donc ta classe Traitementbut1 doit connaitre l'instance de PanneauTest à utiliser. Tu peux par exemple passer cette instance au constructeur de Traitementbut1

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public class Traitementbut1 implements ActionListener {
        public Traitementbut1(PanneauTest panneau){
            this.panneau = panneau;
        }
        public void actionPerformed(ActionEvent e){
    	panneau.taMethode(tesParametres);
        }
     
    }

  3. #3
    Membre confirmé Avatar de tarpal
    Homme Profil pro
    Ingénieur Electronique retraité
    Inscrit en
    Février 2016
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur Electronique retraité
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2016
    Messages : 70
    Par défaut
    Bonjour @tchize@
    Merci pour la réponse.
    Comme tu as pu le constater je débute en java...
    J'ai bien compris qu'instancier c'était mettre un constructeur dans une class.
    Il est clair que je dois reprendre et revoir les cours en détail...
    Pour ce qui est de mon problème, je vais essayer donc d'appeler la méthode comprise dans ma class "PanneauTest" et non plus ma class elle même.
    Je vais m'exécuter et tester mon code rectifié.
    Dans tous les cas je reviendrais vous informer...
    A+

  4. #4
    Membre confirmé Avatar de tarpal
    Homme Profil pro
    Ingénieur Electronique retraité
    Inscrit en
    Février 2016
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur Electronique retraité
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2016
    Messages : 70
    Par défaut
    Re
    Je reviens sur la discussion car j'ai essayé le code que tu as proposé mais j'ai des erreurs que je ne comprend pas.
    En fait dans ma class PanneauTest, j'ai créé une méthode pour appeler une image ( que j'ai placé dans la racine de mon projet )
    J'ai trois erreurs dans ma class FenetreTest
    Ligne 79 , Ligne 83 et je pense en conséquence Ligne 42.
    J'ai mis un commentaire important lignes 57-58-59 qui précise bien que je réussi à charger mon image quand mon code est dans la class FenetreTest.
    Mais en fait je ne veux charger cette image que lorsque je clique sur le bouton et pas ailleurs.

    Je soumets le code ci-dessous :

    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
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    package testGraphics;
     
    import java.awt.Color;
    import java.awt.Graphics;
    import java.awt.BorderLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
     
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JLabel;
    import javax.swing.JButton;
    import javax.swing.JComponent;
     
    // Code Pour la Fenêtre
    public class FenetreTest extends JFrame
    {
    	private static final long serialVersionUID = 1L;
     
    	public FenetreTest()
          {  
    	  // Taille fenetre en 16/9
          //int x = 1110;
          //int y = 700;
           int x = 500;
           int y = 300;
           JFrame frame ;
           frame = new JFrame ("PROGRAMME TEST GRAPHICS");
           frame.setSize(x,y);
            //this.setSize(x, y);
            frame.setLocation(350,100);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
            // Création du conteneur
            JPanel pan = new JPanel();
            pan.setBackground(Color.ORANGE);
            frame.setContentPane(pan);
     
            // Création des boutons et implémentation dans le conteneur JPanel
            JButton but1 = new JButton ( "Charger Image ");
            but1.setBackground((Color.CYAN));
            but1.addActionListener(new Traitementbut1());
     
            JButton but2 = new JButton ( "Réaliser Mesures ");
            but2.setBackground((Color.GREEN));
            but2.addActionListener(new Traitementbut2());
     
            JLabel lab = new JLabel ("L'IMAGE SERA TELECHARGEE ICI ");
     
          //On définit le layout à utiliser sur le ContentPane
            frame.setLayout(new BorderLayout());
            //On ajoute les boutons et image dans le Layout
            frame.getContentPane().add(but1,BorderLayout.NORTH);
            frame.getContentPane().add(but2,BorderLayout.SOUTH);
            frame.getContentPane().add(lab,BorderLayout.CENTER);
     
            // Si je mets l'instruction ci-dessous je charge bien mon image...
            //frame.getContentPane().add(new PanneauTest(),BorderLayout.CENTER);
            // Mais je ne veux le faire qu'en cliquant sur Boutton (but1) 
     
            //this.setVisible(true);
            frame.setVisible(true);
             }
        /*  
         public class Traitementbut1 implements ActionListener
           {
        	 public void actionPerformed(ActionEvent e)
             {
    		// JE SOUHAITE APPELER LA METHODE paintComponent(Graphics g) ICI
            // ET JE N'Y ARRIVE PAS !!!
            // Vérification du fonctionnement du bouton but1
            System.out.println(" J'ai cliqué sur boutton Charger Image  !");
             }
            }
          */
    	public class Traitementbut1 implements ActionListener
    	{
    		public Traitementbut1(PanneauTest panneau){
    	        this.panneau = panneau;
     
    		public void actionPerformed(ActionEvent e)
    		{
    		panneau.paintComponent(getGraphics());
    		System.out.println(" J'ai cliqué sur boutton Charger Image  !");
    	    }
     
    	}
     
     
     
           public class Traitementbut2 implements ActionListener
             {
                public void actionPerformed(ActionEvent e)
                {
                // Vérification du fonctionnement du bouton but2
                System.out.println("J'ai cliqué sur boutton Réaliser Mesures !");
                }
             }
    Merci encore pour ton aide
    A+

  5. #5
    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
    Ligne 79, tu as écris this.panneau = panneau.
    Ceci ce lit "mettre dans le champ "panneau" de ma classe la valeur de la variable panneau reçue en paramètre du constructeur.

    Or tu n'a pas déclaré de champ panneau dans ta classe. Donc erreur. Deuxième erreur, deux lignes plus bas: tu as oublié l'accolade fermante de ton constructeur avant de déclarer ta méthode. Ce qui devrait donner


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    	public class Traitementbut1 implements ActionListener
    	{
    		public Traitementbut1(PanneauTest panneau){
    	            this.panneau = panneau;
                    }
     
    		public void actionPerformed(ActionEvent e)
    		{
    		    panneau.paintComponent(getGraphics());
    		    System.out.println(" J'ai cliqué sur boutton Charger Image  !");
    	        }
     
    	}

    Je continue. Ton actionPerformed est incorrect. Tu n'es pas censé appeler toi même paintComponent, c'est swing qui l'appel avec un Graphics adapté. De même tu n'es pas censé appeler getGraphics() en dehors d'une opération de redessin déjà en cours. Si ton but est de demander à panneau de se redessiner, il faut appeler panneau.repaint();

    Ton autre question:

    // Si je mets l'instruction ci-dessous je charge bien mon image...
    //frame.getContentPane().add(new PanneauTest(),BorderLayout.CENTER);
    // Mais je ne veux le faire qu'en cliquant sur Boutton (but1)
    [/QUOTE]
    Tu peux mettre ce code là simplement dans le code de l'actionListener du bouton. Cependant il y a une subtilité. Quand tu ajoute des composants dans une fenêtre déjà visible, il faut appeler ensuite revalidate() pour demander à ta fenêtre de refaire ses calculs de tailles.

    Autre remarque importante. Ta classe FenetreTest étends JFrame, mais au final la JFrame que tu rends visible est une instance séparée créée à partir de new JFrame(title).
    • Soit tu affiche la fenêtre FenetreTest , tu mets tes trucs dedans à la place de ta jframe et tu oublie ce new JFrame(".....")
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      public FenetreTest() {  
             super("PROGRAMME TEST GRAPHICS");
             int x = 500;
             int y = 300;
             setSize(x,y);
             setLocation(350,100);
             setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
       
              // Création du conteneur
              JPanel pan = new JPanel();
              pan.setBackground(Color.ORANGE);
              setContentPane(pan);
      .......
    • Soit ta classe FenetreTest n'a aucune raison d'étendre JFrame, c'est juste une classe de base, ce n'est pas un composant graphique.
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      // Code Pour la Fenêtre
      public class FenetreTest {
      	private static final long serialVersionUID = 1L;



    Enfin, c'est un peu plus avancé, mais sache qu'il y a des moyens plus simples depuis java 8 d'enregistrer des listeners dans swing, c'est de passer directement des références de méthode. Exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
        public Fenetre () {
           //........
            JButton but1 = new JButton ( "Charger Image ");
            but1.setBackground((Color.CYAN));
            but1.addActionListener(this::traitementBut1);
           //........
        }
     
     
        public void traitementBut1(ActionEvent e) {
            System.out.println("bouton machin cliqué");
        }
    C'est valable pour tous les listenesr ayant une seule méthode (en réalité pour tous les listener qui sont des interfaces fonctionnelle, mais à peu près tout a été déplacé vers ça en swing). Il suffit de pointer donc vers une méthode qui a la même signature, sous la forme instance::nomDeMethode.

  6. #6
    Membre confirmé Avatar de tarpal
    Homme Profil pro
    Ingénieur Electronique retraité
    Inscrit en
    Février 2016
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur Electronique retraité
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2016
    Messages : 70
    Par défaut
    Rebonjour @tchize_@
    Je te remercie sincèrement de m'avoir pris en main...
    Je vais bien prendre en compte toutes tes remarques et les analyser car tes remarques sont très riches d'enseignement pour moi.
    Je revoie mes cours ,mes tutos et mes manips avant de revenir sur le sujet.
    Je ne voudrais pas te faire perdre ton temps et être un peu plus efficace dans ma programmation.
    A+

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 31/03/2007, 15h32
  2. sql ne comprend pas mon where!et me demande des parametres
    Par marie10 dans le forum Langage SQL
    Réponses: 10
    Dernier message: 20/04/2004, 11h08
  3. [Rave] un message que je ne comprends pas
    Par Clotilde dans le forum Rave
    Réponses: 2
    Dernier message: 30/09/2003, 21h46

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