Evénement de souris dans un JPanel (Java)

Résolu/Fermé
csi_bern Messages postés 64 Date d'inscription lundi 29 mars 2010 Statut Membre Dernière intervention 26 octobre 2020 - 14 août 2010 à 15:20
 Utilisateur anonyme - 19 août 2010 à 09:47
Bonjour,

J'ai deux classe pour l'instant dont voici un résumé :

import java.awt.BorderLayout;

import javax.swing.JFrame;

public class Fenetre extends JFrame { 

	private panImage panGauche = new panImage();

	public Fenetre(){
		this.setSize(300, 300);
		this.getContentPane().add(panGauche, BorderLayout.CENTER);
		this.setVisible(true);
	}
}


et

import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.JPanel;

public class panImage extends JPanel {
	public void PanImage() {
		this.addMouseListener(new MouseAdapter() {
			public void mousePressed(MouseEvent e) {
				System.out.println("cliqué " + e.getX());
			}
		});
	}
	
	public void paintComponent(Graphics g) {
		g.setColor(Color.black);
		g.fillRect(50, 50, 50, 50);
	}
}


(a méthode main a été sortie)

Ma question est la suivante : pourquoi quand je clique dans ma fenêtre, qui contient don mon JPanel, le message demandé via println ne s'affiche pas dans la console ? J'ai mis ce println comme test car toutes les actions que je voulais récupérer par le clique de souris ne fonctionne pas !

Please help
Merci d'avance

A voir également:

4 réponses

Utilisateur anonyme
15 août 2010 à 22:27
Re,
J'ai besoin de plus d'infos concernant tes 2 classes...

Avant tout, il serait mieux d'avoir des classes dont le nom commence par une majuscule.

-Est ce que public class Fenetre extends JFrame { est bien la classe 1 ?

-et public class PanImage extends JPanel { la classe 2

-Comment procèdes tu pour appeler la classe 2 depuis la classe 1 ?

-Tu dis "Il n'y aurait pas moyen d'insérer le listener directement dans la classe 2 ?" C'est ce que tu fais non?

-Il serait bien que tu nous donnes plus de code (surtout concernant la classe 2)

Merci...

Dan
1
csi_bern Messages postés 64 Date d'inscription lundi 29 mars 2010 Statut Membre Dernière intervention 26 octobre 2020 2
15 août 2010 à 07:45
Salut Dan,

Merci pour ta réponse. Malheureusement, quand j'appèle ma classe (classe 2) depuis une autre (classe 1), le système de clique ne marche pas.

Je peux cependant mettre dans la classe 1 un listener sur la classe 2, mais à force je vais "surcharger" ma classe 1. Il n'y aurait pas moyen d'insérer le listener directement dans la classe 2 ?
0
csi_bern Messages postés 64 Date d'inscription lundi 29 mars 2010 Statut Membre Dernière intervention 26 octobre 2020 2
16 août 2010 à 07:40
Salut Dan,

Merci de tes réponses. Pour moi c'est encore un peu dur le Java, je viens de m'y mettre.

Tout d'abord concernant le nom des classes tu as raison, c'est une erreur de ma part. Ensuite, Fenetre est bien la classe 1 et PanImage la classe 2. Pour appeler la classe 2, je fais dans la déclaration des variables un "private PanImage panGauche = new PanImage()," (je fais de même avec une deuxième variable appelée panDroit). Ensuite, je fais un "panPrinc.add(panGauche, null);" (panPrinc étant un JPanel en setLayout(null)). panGauch est positionné dans le panPrinc par un setBounds.

En fait, je disais que le listener de la classe 2 ne fonctionnait pas, en tout cas depuis la classe 1. Et c'est bien ça le problème. Je t'enverrais bien mes codes en entier, mais ils commencent à devenir conséquent. En plus, je les ai bien modifiés depuis mon dernier post afin d'utiliser un listener sur la classe 2 dans la classe 1 (j'espère que c'est compréhensible). Donc dans la classe 1, j'ai fait "panGauche.addMouseListener(...);".

Bon si jamais ça te prend pas trop de temps, merci de me renseigner. J'aimerais bien réussir à faire cela, ça allégerait nettement mon code et le rendrait plus facile à comprendre. Mais bon, pour l'instant ça fonctionne et c'est bien là le principal. Si jamais, je pourrais t'envoyer les sources par mail
0
Utilisateur anonyme
16 août 2010 à 20:15
Re,

Avant de me plonger dans tes classes j'aimerais que tu me fasses un topo de ce que tu dois faire (à part afficher les coordonnées du clic) car j'avoue que pour moi ce n'est pas clair... merci.

Cordialement,

Dan
0
csi_bern Messages postés 64 Date d'inscription lundi 29 mars 2010 Statut Membre Dernière intervention 26 octobre 2020 2
Modifié par csi_bern le 17/08/2010 à 08:39
Salut Dan,

Je dois faire quelque chose qui ressemble au code que tu m'as envoyé.

Dans la classe 2, j'affiche tous les points qui ont été cliqués (ceux-ci sont inscrits dans un ArrayList).

Dans la classe 1, j'insère 2 objets de la classe 2. Ainsi, c'est quand je clique dans un de ces objets que le nouveau point doit s'afficher à l'endroit du clique et en plus des points précédents.

J'ai réussi à réaliser cela, tout focntionne, le seul problème, c'est que je n'arrive pas à comprendre pourquoi le "this.addMouseListener(new MouseAdapter() " dans la classe 2 ne fonctionne pas.

En fait, en revoyant mon code (plusieurs jours après et à tête reposée), je me demande si cela ne vient pas du fait que j'ai mis un void dans mon constructeur de la deuxième classe et qu'il a une majuscule de différence (que tu m'avais déjà signalée auparavant) : "public void PanImage()".

Malheureusement, j'ai oublié mon ordi aujourd'hui, je ne pourrai pas tester avant ce soir. S'il ne s'agit que de ça, je te redirai.

Merci en tout cas encore une fois pour le temps passé à mon problème
0
Utilisateur anonyme
18 août 2010 à 19:23
"je me demande si cela ne vient pas du fait que j'ai mis un void dans mon constructeur ..."

Les constructeurs n'ayant pas de valeur de retour sont donc void par defaut, qu'on l'indique ou pas, je ne pense donc pas que le problème vienne de la présence de void...

Dan
0
csi_bern Messages postés 64 Date d'inscription lundi 29 mars 2010 Statut Membre Dernière intervention 26 octobre 2020 2
19 août 2010 à 08:21
Salut,

En fait si, le problème venait du constructeur car ça fonctionne maintenant. Si ce n'est pas forcément de void, ça devait venir que j'avais une majuscule de différence entre la classe et le constructeur.

C'est ce genre de petites erreurs que tu ne remarques pas qui me font détester la programmation parfois !
0
Utilisateur anonyme
19 août 2010 à 09:47
Tu avais laissé la classe panImage sans P majuscule ?
Ce n'était donc pas un constructeur mais une méthode void...

Mais je n'ai pas suffisamment de code pour voir l'incidence car il n'y avait pas de retour possible.

Bref, si ça fonctionne c'est l'essentiel.


@++

Dan
0
Utilisateur anonyme
14 août 2010 à 20:27
Salut,

Je te propose cette petite classe (qui est un extrait d'un de mes programmes) et qui montre comment obtenir les coordonnées d'un clic.

   import javax.swing.*;
   import java.awt.*; // dont Toolkit et Graphics
   import java.awt.event.*;
   
    public class CoordonneesDeClic extends JFrame
   {
      //private Image img;
      private Color jauneclair = new Color(255, 255, 212);
   
      private int x, y;
      private int x1, y1; // pour ... (pas encore utilisé)
      private int xClic, yClic;
      private boolean clic = false;
      
   	
      private static Font font10;
      
       public CoordonneesDeClic()
      {
         super("Cliquer dans le cadre pour obtenir les coordonnees du clic sur la console."); // titre
         setSize(538, 770); // dimensions frame (redimensionnable par défaut)
         setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
         setVisible(true);
         addMouseListener(new Moustener());
      }
   
       public void paint(Graphics g)
      {
		//Graphique des coordonees:
         super.paint(g);Polygon rectangle2 = new Polygon();  // rectangle noir
         rectangle2.addPoint(xClic -20, yClic -12);   // point haut gauche
         rectangle2.addPoint(xClic +22, yClic -12);   // point haut droite
         rectangle2.addPoint(xClic +22, yClic +14);   // point bas droite
         rectangle2.addPoint(xClic -20, yClic +14);   // point bas gauche
         g.setColor(Color.black);    // fond du rectangle
         g.fillPolygon(rectangle2);  // remplissage
         g.drawPolygon(rectangle2);  // affichage
               
                 // dessin du graphique des coordonnées (en blanc)
         g.setFont(font10);
         g.setColor(Color.white);
         g.drawString(Integer.toString(yClic), xClic -19, yClic +4); // val. y du clique
         g.drawString(Integer.toString(xClic), xClic -3, yClic -4);  // val. x du clique
            	
            	// flecheAbscisses (x) sans la pointe
         g.drawLine(xClic -2, yClic -1, xClic +18, yClic -1); // points x, y gauche... et droite
               
               // pointe de cette fleche
         g.drawLine(xClic +16, yClic -3, xClic +22, yClic -1); // points x, y gauche... et droite \
         g.drawLine(xClic +16, yClic +2, xClic +22, yClic -1); // points x, y gauche... et droite /
                
            	// flecheOrdonnées (y) sans la pointe
         g.drawLine(xClic, yClic -3, xClic, yClic +9); // points x, y haut... et bas
                 
               // pointe de cette fleche
         g.drawLine(xClic -2, yClic +6, xClic, yClic +12); // points x, y haut... et bas \
         g.drawLine(xClic +2, yClic +6, xClic, yClic +12); // points x, y haut... et bas /
      
      }
      
       public static void main(String[] args)
      {
         font10 = new Font("SansSerif", Font.BOLD, 10);
         new CoordonneesDeClic();
      }
   
       private class Moustener extends MouseAdapter
      {
          public void mouseClicked(MouseEvent evt)
         {
            clic = true;	
            /*System.out.println("\nL 3260  mouseClicked(MouseEvent evt)\n"
               + "       " + "w/h  clic/cliquéEn/trueFalse[icop]/fig :\n"
               + "       " + w + "/" + h + "  " + clic + "/" + cliquéEn
               + "/" + trueFalse[icop] + "/" + fig); */
            xClic = evt.getX();
            yClic = evt.getY();
            System.out.println("L 40  xClic/yClic: "+ xClic + "/" + yClic);
            repaint(); // pour afficher le graphique des coordonnées
         }
      }
   }


Cordialement,

Dan
-1