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

Agents de placement/Fenêtres Java Discussion :

Problème de source sur MouseListener


Sujet :

Agents de placement/Fenêtres Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    12
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 12
    Par défaut Problème de source sur MouseListener
    Bonjour,

    J'essaie de faire un jeu de Yams en Java et je rencontre quelques difficultés, notamment liées au rafraichissement du panel.

    Je n'en suis qu'au début, donc tout ce que peut faire mon programme est :
    - Afficher cinq dés avec une valeur prise au hasard
    - Relancer les dés en reprenant des valeurs au hasard

    Je ne me suis pas encore aventuré plus loin, puisque je bloque sur la source. Dans le jeu du Yams, il faut sélectionner des dés, soit ceux que l'on va garder, soit ceux que l'on souhaite changer, cela n'a pas d'importance pour l'instant.

    J'aimerais déjà faire afficher au programme sur quel dé est-ce que je clique : si je clique sur le premier il affiche 1, sur le second il affiche 2, etc. Simple.
    Mon problème est que cela ne marche plus une fois que j'ai relancé les dés, le nom de la source semblant avoir changé. Cela vient de ma classe Frame, elle est divisée en deux :
    - Le constructeur construit les éléments qui ne bougeront pas, puis appelle la fonction afficherFrame()
    - La fonction afficherFrame() créé et affiche les cinq dés, qui sont des JCanvas.

    J'ai effectué ce découpage de façon à ce que lorsque l'on clique sur le bouton de Lancement, on génère de nouvelles valeurs de dés et on relance directement afficherFrame, qui va actualiser les JCanvas des dés. Le souci, c'est que j'ai l'impression que les dés sont mis les uns par-dessus les autres (pour que ça ne se voie pas, je commence par dessiner un rectangle blanc). Cela pourrait être la cause de mon problème, puisqu'il semblerait qu'à chaque nouvelle recréation, la source du clic ne réponde plus correctement.

    Le bouton de lancement de dés est créé par le constructeur de la Frame, et sa source fonctionne toujours. Par contre, si je le créé seulement à l'intérieur de la fonction afficherFrame, il subit le même sort que les dés et sa source cesse de fonctionner après la première réactualisation.

    Quelqu'un peut-il m'expliquer d'où vient le problème ? Je pense qu'une cause de la résolution serait un petit coup de main sur le nettoyage du code en vue d'un rafraichissement propre du panel et des JCanvas ! Merci


    Classe principale : GUI.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
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
     
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;
    public class GUI
    	{
     
    	public Frame f1;
     
     
    	public GUI()
    		{
    		De d1= new De();
    		JCanvas j1 = new JCanvas(d1);
    		De d2= new De();
    		JCanvas j2 = new JCanvas(d2);
    		De d3= new De();
    		De d4= new De();
    		De d5= new De();
    		Frame f1 = new Frame(j1,j2,d3,d4,d5); // Un peu patchwork, c'était pour tester ce qu'il se passait en fonction des endroits où on recréait les canvas
    		this.f1=f1;
    		f1.boutonlancer.addMouseListener(new ClicMouseAdapter());
    		f1.j1.addMouseListener(new ClicMouseAdapter());
    		f1.j2.addMouseListener(new ClicMouseAdapter());
    		f1.j3.addMouseListener(new ClicMouseAdapter());
    		f1.j4.addMouseListener(new ClicMouseAdapter());
    		f1.j5.addMouseListener(new ClicMouseAdapter());
    		}
     
    	void refreshGUI()
    		{
    		De d1= new De();
    		JCanvas j1 = new JCanvas(d1);
    		De d2= new De();
    		JCanvas j2 = new JCanvas(d2);
    		De d3= new De();
    		De d4= new De();
    		De d5= new De();
    		f1.afficherFrame(j1,j2,d3,d4,d5); // Un peu patchwork, c'était pour tester ce qu'il se passait en fonction des endroits où on recréait les canvas
    		}
     
     
    	public class ClicMouseAdapter extends MouseAdapter 
    		{
     
    		public ClicMouseAdapter() 
    			{
     
    			}
     
    		public void mouseClicked(MouseEvent arg0)
    			{
    			Object source = arg0.getSource();
    			if(source==f1.boutonlancer) // Si la source est le bouton de lancer, alors on lance la fonction de refresh et on affiche Lancer dans la console
    				{
    				refreshGUI();
    				System.out.println("Lancer");
    				}
    			else if(source==f1.j1) // Si la source est le premier dé, alors on affiche 1 dans la console.
    					{
    					System.out.println("1");
    					}
    					else // Sinon, on affiche No check dans la console
    						System.out.println("No check");
    			}
    		}
     
    	public static void main(String[] args) 
    		{
    		new GUI();
    		}
     
    }

    Classe qui fait chier : Frame.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
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
     
    import java.awt.Color;
     
     
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
     
     
    public class Frame extends JFrame {
     
    	private static final long serialVersionUID = 1L;
     
    	public JButton boutonlancer;
    	public JPanel panel;
    	public JFrame frame;
    	public JLabel lancer;
    	public JCanvas j1;
    	public JCanvas j2;
    	public JCanvas j3;
    	public JCanvas j4;
    	public JCanvas j5;
     
    	public Frame(JCanvas j1,JCanvas j2,De d3,De d4,De d5)
    		{
    		JFrame frame = new JFrame("Test");
    		this.frame=frame;
    		frame.setBounds(720,365,240+8,320+30);
    		JPanel panel = new JPanel();
    		this.panel=panel;
    		JButton boutonlancer = new JButton(""); // Voilà le bouton de lancer
    		this.boutonlancer=boutonlancer;
    		boutonlancer.setBounds(200,265+11,35,35);
    		boutonlancer.setBackground(Color.PINK);
    		JLabel lancer = new JLabel("Go"); // Un texte "Go", pas important
    		this.lancer=lancer;
    		lancer.setBounds(210,250+11,35,10);
    		panel.setBackground(Color.WHITE);
     
    		afficherFrame(j1,j2,d3,d4,d5); // La fonction qui créé et affiche les JCanvas
     
    		}
     
     
    	public void afficherFrame(JCanvas j1,JCanvas j2,De d3,De d4,De d5)
    		{				
    		panel.setLayout(null);	// Pour utiliser setBounds à fond	
     
    		this.j1=j1; // Sur les deux premiers, la création se fait à l'extérieur. Le résultat est identique.
    		panel.add(j1);
    		j1.setBounds(5,265+11,35,35);
     
    		this.j2=j2;
    		panel.add(j2);
    		j2.setBounds(44,265+11,35,35);
     
    		JCanvas j3 = new JCanvas(d3);
    		this.j3=j3;
    		panel.add(j3);
    		j3.setBounds(83,265+11,35,35);
     
    		JCanvas j4 = new JCanvas(d4);
    		this.j4=j4;
    		panel.add(j4);
    		j4.setBounds(122,265+11,35,35);
     
    		JCanvas j5 = new JCanvas(d5);
    		this.j5=j5;
    		panel.add(j5);
    		j5.setBounds(161,265+11,35,35);
     
    		panel.add(boutonlancer);	
    		panel.add(lancer);
    		frame.add(panel);
    		frame.setVisible(true);
    		}
     
    }
    Classe pour initialiser un dé : De.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
     
     
    import java.util.Random;
     
     
    public class De 
    	{
     
    	public int valeur;
     
     
    	public De()
    		{
    			this.valeur=0;
    			Random r = new Random();
    			int i = (r.nextInt(6))+1;
    			this.valeur=i;
    		}
    	}
    Classe qui gère les JCanvas, ne pose à priori par de problèmes : JCanvas.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
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
     
    import java.awt.Color;
    import java.awt.Graphics;
     
    import javax.swing.JPanel;
     
    public class JCanvas extends JPanel
    	{
    	private static final long serialVersionUID = 1L;
     
    	De d = new De();
     
    	public JCanvas(De d)
    		{
    		this.d=d;
    		}
     
    	public void update(Graphics g) {
    		    paint(g);
    		  }
     
    	public void paint(Graphics g) 
    		{
    				Color c = g.getColor();
    				g.setColor(Color.WHITE);
    				g.fillRect(0,0,34,34); // Gros carré blanc pour masquer les dés du dessous... pas la meilleure solution :(
    				g.setColor(Color.BLACK);
    				g.drawRect(0,0,34,34);
     
    				if(d.valeur==1)
    					{
    					g.fillOval(13,13,8,8);
    					}
    				if(d.valeur==2)
    					{
    					g.fillOval(5,5,8,8);
    					g.fillOval(21,21,8,8);
    					}
    				if(d.valeur==3)
    					{
    					g.fillOval(4,4,8,8);
    					g.fillOval(13,13,8,8);
    					g.fillOval(22,22,8,8);
    					}
    				if(d.valeur==4)
    					{
    					g.fillOval(4,4,8,8);
    					g.fillOval(4,22,8,8);
    					g.fillOval(22,22,8,8);
    					g.fillOval(22,4,8,8);		
    					}
    				if(d.valeur==5)
    					{
    					g.fillOval(4,4,8,8);
    					g.fillOval(4,22,8,8);
    					g.fillOval(13,13,8,8);
    					g.fillOval(22,22,8,8);
    					g.fillOval(22,4,8,8);
    					}
    				if(d.valeur==6)
    					{
    					g.fillOval(3,3,8,8);
    					g.fillOval(3,13,8,8);
    					g.fillOval(3,23,8,8);
    					g.fillOval(23,3,8,8);
    					g.fillOval(23,13,8,8);
    					g.fillOval(23,23,8,8);
    					}
    				g.setColor(c);
     
    		}
    	}

  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
    Tu lies tes mouseListener a tes instance de JCanevas dans le constructeur de ta GUI. Lorsque tu retire les dés, tu place de nouveaux JCanevas, mais tu ne leur lie pas de listener. Soit tu garde les anciens canevas, soit tu ajoute des listener sur les nouveaux canevas que t'as créé.

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    12
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 12
    Par défaut
    J'avais déjà essayé avec des MouseListener un peu partout, ça ne changeait rien.
    J'ai donc placé les MouseListener à même la frame, en faisant le lien dans afficherFrame(); et en plaçant la fonction d'écoute, avec ses instructions, dans la classe Frame. Comme toujours, ça ne marche qu'une seule fois ! Dès que je relance, si je clique sur le premier dé il me met "No check" au lieu de "1", comme s'il ne s'appelait plus j1.

    Je pense que le problème vient du fait que justement, je ne supprime pas les anciens dés ! J'en avais chié pour faire le rafraichissement de ma Frame, et j'ai fait quelquechose à l'arrache qui fonctionne en apparence. Mais il semblerait que ça pose quelques problèmes.

    Si je garde mes anciens JCanvas, ça ne fonctionne plus du tout puisqu'ils ont besoin d'être renouvelés pour être redessinés. Quoique j'ai une idée, je vais essayer de faire un système comme mon afficherFrame qui utilise une fonction membre à moi pour actualiser... ça évitera de faire un New à chaque fois.

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    12
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 12
    Par défaut
    Il semble que mon problème soit résolu.

    J'ai créé ça dans ma JCanvas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public void maj(De d)
    	{
    	this.d=d;
    	repaint();
    	}
    Dans ma classe Frame, je créé les JCanvas une fois dans le constructeur, ensuite le constructeur appelle toujours la fonction afficherFrame, laquelle effectue la mise à jour de chaque JCanvas (fonction maj) avec son Dé passé en paramètre. Le Dé est toujours renouvelé dans le GUI. Le constructeur de Frame et afficherFrame() ont toujours les cinq dés en paramètres, de façon à les réutiliser dans la fonction maj() du JCanvas.

    Ce qui donne pour le constructeur de la Frame :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    		JCanvas j1 = new JCanvas(d1);
    		this.j1=j1;
    		JCanvas j2 = new JCanvas(d2);
    		this.j2=j2;
    		JCanvas j3 = new JCanvas(d3);
    		this.j3=j3;
    		JCanvas j4 = new JCanvas(d4);
    		this.j4=j4;
    		JCanvas j5 = new JCanvas(d5);
    		this.j5=j5;
    		afficherFrame(d1,d2,d3,d4,d5);
    La fonction afficherFrame() :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public void afficherFrame(De d1,De d2,De d3,De d4,De d5)
    		{				
     
    		j1.maj(d1);
    		panel.add(j1);
    		j1.setBounds(5,265+11,35,35);
     
    		(etc.......)
     
    		}
    GUI :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    De d1= new De();
    De d2= new De();
    De d3= new De();
    De d4= new De();
    De d5= new De();
    Frame f1 = new Frame(d1,d2,d3,d4,d5);
    RefreshGUI :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    De d1= new De();
    De d2= new De();
    De d3= new De();
    De d4= new De();
    De d5= new De();
    f1.afficherFrame(d1,d2,d3,d4,d5);
    Merci à tchize pour m'avoir orienté sur l'idée de garder les anciens JCanvas

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

Discussions similaires

  1. Problème d'ecouteur sur un bouton(MouseListener)
    Par titi42 dans le forum AWT/Swing
    Réponses: 8
    Dernier message: 30/09/2009, 17h24
  2. Problème de reqûete sur la date, année et mois en cours
    Par Jean-Marc dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 16/02/2004, 16h36
  3. [CR] Problème de sélection sur un champ date
    Par noluc dans le forum SAP Crystal Reports
    Réponses: 2
    Dernier message: 21/11/2003, 16h56
  4. Problème avec RDTSC sur K6-III
    Par le mage tophinus dans le forum x86 32-bits / 64-bits
    Réponses: 17
    Dernier message: 30/09/2003, 09h43
  5. problème de float sur SQL server 2000.
    Par fidji dans le forum MS SQL Server
    Réponses: 9
    Dernier message: 24/07/2003, 14h15

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