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

AWT/Swing Java Discussion :

Probleme Listener sur JSpinner ou dans class


Sujet :

AWT/Swing Java

  1. #1
    Membre éclairé
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2006
    Messages
    350
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2006
    Messages : 350
    Par défaut Probleme Listener sur JSpinner ou dans class
    Bonjours, je vous présente d’abord mes classes :

    - JPanelCaracteristique : étend un JPanel et contient un JLabel et un JSpinner,
    - JPanelJoueur : étend un JPanel et contient plusieurs caractéristiques
    - JPanelAction : qui étend un JPanel et contient deux joueurs,
    - JPanelPhysique : qui étend un JPanelAction avec des surcharges spécifiques,
    - JPanelCosmique : qui étend un JPanelAction avec des surcharges spécifiques,
    - JPanelCombat : qui utilise JPanelPhysique et JPanelCosmique dans un JTabbedPane.

    Dans la classe JPanelCaracteristique j’ai mis une méthode addActionListener(ActionListener p_action) qui applique l’action passer en paramètre au JSpinner.
    Dans la classe JpanelJoueur, je fais suivre dans la méthode addActionListener(ActionListener p_action) l’action a toutes les caractéristique.
    Dans la classe JPanelAction, j’ai mis une méthode addActionListener(ActionListener p_action) qui applique l’action au deux joueurs.
    Dans les classes qui étendent JPanelAction, je ne touche pas à la méthode addActionListener.
    Dans la classe JPanelCombat, je crée l’interface et j’ajoute les listeners et la tout marche.

    Ainsi lorsque je modifie une caractéristique sur un joueur, ben je le sais et je peux recalculer ce qui est nécessaire.

    Ca c'est bon
    ***********************************************************************


    J’ai réitéré la même chose dans un panneau JpanelEffet qui contient également des JPanelcaracteristique. J’ai limite fais un copié-collé de la classe JPanelJoueur avec des modifications bien sûr !!!

    Deux JPanelEffet sont ajouté en bas de JPanelAction (donc par extension à JPanelPhysique et Cosmique). Et la, il ne fonctionne pas.

    Alors le résultat est aucune erreur, mais aucune action non plus.

    Ce que je sais :
    - on passe bien dans la méthode (affichage en entrant et en sortant correct),
    - le listener marche si on ajoute directement l’action dans le constructeur (essaie temporaire)
    - si on laisse l’action du constructeur + on ajoute l’action souhaité, c’est l’action constructeur qui apparaît (test avec deux affichages différents).


    Pourquoi j’aurais ça ?

    Merci

  2. #2
    Membre éclairé
    Avatar de seiryujay
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 950
    Par défaut
    Je ne sais pas pour les autres, mais j'ai du mal à comprendre ce que tu dis...

    Petites questions en passant :
    - on passe bien dans la méthode (affichage en entrant et en sortant correct),
    Quelle méthode ?
    - le listener marche si on ajoute directement l’action dans le constructeur (essaie temporaire)
    Quelle action dans quel constructeur ?
    - si on laisse l’action du constructeur + on ajoute l’action souhaité, c’est l’action constructeur qui apparaît (test avec deux affichages différents).
    Hein ?

  3. #3
    Membre éclairé
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2006
    Messages
    350
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2006
    Messages : 350
    Par défaut
    Oui c'est pas faut !!! J'ai essayé de bien détaillé et a la fin je fait n'importe quoi !!!

    Dans la classe JPanelAction, j'appelle la méthode qui ajoute les listener au deux JPanelEffet.
    Dans la classe JPanelEffet, la méthode addActionListener(ActionListener p_action) ne fait qu'appliquer la même action a tous les PanelCaracteristique.

    Dans cette même méthode, je suis certain que l'on y passe. Je fais un affichage en entrant et en sortant.
    Mais l'action ne fonctionne pas lorsque l'on titille les JSpinner.

    J'ai fait un test en mettant une action dès la création du composant. Et là ça marche.
    J'ai même fait un copier collé de ce code dans la méthode ou je l'ajoute pour tous et ça ne marche pas ...


    J'ai pas le code sous la main, je le met en ligne ce soir.
    Car je suis certain que j'ai une erreur a la con car dans l'autre classe cela marche et il n'y a pas de raison !!!

  4. #4
    Membre éclairé
    Avatar de seiryujay
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 950
    Par défaut
    Alors, je vais peut-être dire une connerie, mais j'ai l'impression que tu rencontres un peu les mêmes problèmes que moi lorsque j'essayais d'utiliser des KeyListener dans mon appli et où j'ai été contraint d'utiliser le KeyBinding.

    J'explique :
    - j'avais une JFrame qui devait capter certains évènements clavier (tels que CTRL+C, CTRL+V) qui n'étaient pas pris en compte par mes mnemonic (pour les boutons) ou mes accelerators (pour les menus)
    - j'avais des JInternalFrame qui devaient capter d'autres évènements clavier (tels que l'appui sur les flèches de direction pour déplacer des objets graphiques)
    - j'avais des tableaux qui devaient capter d'autres évènements clavier (tel que l'appui sur la touche Suppr).

    Il se trouve que la touche Suppr devait être prise en compte par ces 3 éléments. Du coup, ce n'était pas toujours le composant que je souhaitais qui captait l'évènement parce que je n'avais pas bien géré les priorités (WHEN_FOCUSED, WHEN_ANCESTOR_OF_FOCUSED_COMPONENT, WHEN_IN_FOCUSED_WINDOW).
    Il existe une hiérarchie de prise en compte de ces évènements, et il faut la respecter. Peut-être est-ce le même problème pour toi, mais sans code, c'est difficile de se rendre compte...

    Je te mets un lien vers ce mécanisme au cas où ce serait ça qu'il te faudrait : http://java.sun.com/docs/books/tutor...eybinding.html

  5. #5
    Membre éclairé
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2006
    Messages
    350
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2006
    Messages : 350
    Par défaut
    ok merci !!! Je regarde ca !!!

    De toute facon je vais envoyer la classe ce soir !!! (celle qui marche et celle qui ne marche pas !!!)

    @+

  6. #6
    Membre éclairé
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2006
    Messages
    350
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2006
    Messages : 350
    Par défaut
    Voici le 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
    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
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    package Panel;
    
    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.ComponentOrientation;
    import java.awt.FlowLayout;
    import java.awt.GridLayout;
    
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.event.ChangeEvent;
    import javax.swing.event.ChangeListener;
    
    import Base.CaracteristiqueArmure;
    import Base.CaracteristiqueJoueur;
    
    
    
    
    public class JPanelEffet extends JPanel {
    	
    	/**
    	 * 
    	 */
    	private static final long serialVersionUID = 1L;
    	
    	CaracteristiqueJoueur m_carEffet;
    	
    	JLabel m_labelNom;
    	
    	JPanelCaracteristique m_panelEffPV;
    	
    	JPanelCaracteristique m_panelEffCO;
    	JPanelCaracteristique m_panelEffTE;
    	JPanelCaracteristique m_panelEffRE;
    	
    	JPanelCaracteristique m_panelEffDegat;
    	JPanelCaracteristique m_panelEffReussite;
    	JPanelCaracteristique m_panelEffResistance;
    	
    	JPanelCaracteristique m_panelEffPP;
    
    	int m_resource = 0;
    	
    	public JPanelEffet() {
    		super();
    		m_carEffet = new CaracteristiqueJoueur();
    		
    		initInterface();
    		m_resource = 1;
    	}
    	
    	public JPanelEffet(String p_nom, int p_PV, int p_CO, int p_TE, int p_RE, int p_degat, int p_touche, int p_resistance,
    				 int p_PP, int p_armureCO, int p_armureTE, int p_armureRE){
    		
    		super();
    		CaracteristiqueArmure l_carArmure = new CaracteristiqueArmure(p_PP, p_PP, p_armureCO, p_armureTE, p_armureRE);
    		m_carEffet = new CaracteristiqueJoueur( p_nom, 0, p_PV, 0, p_CO, p_TE, p_RE, p_degat, p_touche, p_resistance,  l_carArmure);
    		
    		initInterface();
    		m_resource = 1;
    	}
    	
    	public JPanelEffet(String p_nom, CaracteristiqueJoueur p_carEffet){
    		
    		super();
    		m_labelNom = new JLabel(p_nom);
    		m_carEffet = p_carEffet;
    		
    		initInterface();
    		m_resource = 1;
    	}
    	
    	public void initInterface(){
    		
    		int l_D1 = 100;
    		Color l_couleur = new Color(200,200,200);
    		Color l_couleurFont = new Color(100,100,100,0);
    		
    		this.setLayout(new BorderLayout());
    		this.setBackground(l_couleurFont);
    		
    		JPanel l_panelNom = new JPanel();
    		m_labelNom = new JLabel("Nom");
    		l_panelNom.add(m_labelNom);
    		l_panelNom.setBackground(l_couleur);
    		this.add(l_panelNom, BorderLayout.WEST);
    		
    		m_panelEffPV = new JPanelCaracteristique("PV :",m_carEffet.m_PV,l_D1);
    		m_panelEffCO = new JPanelCaracteristique("CO :",m_carEffet.m_CO,l_D1);
    		m_panelEffTE = new JPanelCaracteristique("TE :",m_carEffet.m_TE,l_D1);
    		m_panelEffRE = new JPanelCaracteristique("RE :",m_carEffet.m_RE,l_D1);
    		m_panelEffDegat = new JPanelCaracteristique("+ %Deg :",m_carEffet.m_degat,l_D1);
    		m_panelEffReussite = new JPanelCaracteristique("+ %Reu :",m_carEffet.m_reussite,l_D1);
    		m_panelEffResistance = new JPanelCaracteristique("+ %Res :",m_carEffet.m_resistance,l_D1);
    		m_panelEffPP = new JPanelCaracteristique("PP :",m_carEffet.m_carArmure.m_PP,l_D1);
    		
    		JPanel l_g = new JPanel(new GridLayout(2,8,5,5));
    		l_g.applyComponentOrientation( ComponentOrientation.LEFT_TO_RIGHT);
    		l_g.add(m_panelEffPV);
    		l_g.add(m_panelEffCO);
    		l_g.add(m_panelEffTE);
    		l_g.add(m_panelEffRE);
    
    		l_g.add(m_panelEffPP);
    		l_g.add(m_panelEffDegat);
    		l_g.add(m_panelEffReussite);
    		l_g.add(m_panelEffResistance);
    		l_g.setBackground(l_couleur);
    		
    		this.add(l_g,BorderLayout.CENTER);
    		
    		m_panelEffPV.addChangeListener(new ChangeListener(){
    			public void stateChanged(ChangeEvent arg0) { 
    				System.out.println("ici1"); }});
    	}
    
    	public void initialiserCombat(){
    		getCaracteristique();
    	}
    
    	public void clear(){
    		m_carEffet = new CaracteristiqueJoueur();
    		modifierEtat();
    	}
    	
    	public void raffraichirEtat(){
    		if(m_resource!=0)
    		{
    			m_resource=0;
    			System.out.println("ici");
    			int l_PV = (int)m_panelEffPV.getValeur();
    			int l_CO = (int)m_panelEffCO.getValeur();
    			int l_TE = (int)m_panelEffTE.getValeur();
    			int l_RE = (int)m_panelEffRE.getValeur();
    			int l_degat = (int)m_panelEffDegat.getValeur();
    			int l_touche = (int)m_panelEffReussite.getValeur();
    			int l_resistance = (int)m_panelEffResistance.getValeur();
    			
    			int l_PP = (int)m_panelEffPP.getValeur();
    	
    			CaracteristiqueArmure l_carArmure = new CaracteristiqueArmure(l_PP, l_PP, 0, 0, 0);
    			m_carEffet = new CaracteristiqueJoueur("", 0, l_PV, 0, l_CO, l_TE, l_RE, l_degat, l_touche, l_resistance,  l_carArmure);
    			
    			m_resource=1;
    		}
    	}
    	
    	public void modifierEtat(){
    		if(m_resource!=0)
    		{
    			m_resource=0;
    			m_labelNom.setText(m_carEffet.m_nom);
    			m_panelEffPV.setValeur(m_carEffet.m_PV);
    			m_panelEffCO.setValeur(m_carEffet.m_CO);
    			m_panelEffTE.setValeur(m_carEffet.m_TE);
    			m_panelEffRE.setValeur(m_carEffet.m_RE);
    			m_panelEffDegat.setValeur(m_carEffet.m_degat);
    			m_panelEffReussite.setValeur(m_carEffet.m_reussite);
    			m_panelEffResistance.setValeur(m_carEffet.m_resistance);
    			m_panelEffPP.setValeur(m_carEffet.m_carArmure.m_PP);
    
    		m_resource=1;
    	}
    	}
    	
    	public CaracteristiqueJoueur getCaracteristique(){
    		return m_carEffet;
    	}
    	
    	public void setCaracteristique(CaracteristiqueJoueur p_carJoueur){
    		m_carEffet = p_carJoueur;
    		modifierEtat();
    	}
    	
    	public String getNom(){
    		return m_carEffet.m_nom;
    	}
    	
    	public void setNom(String p_nom){
    		m_labelNom.setText(p_nom);
    		m_carEffet.m_nom = p_nom;
    	}
    	
    	public void addChangedListener(ChangeListener p_changement){
    		System.out.println("Debut addChangedListener");
    		//m_panelEffPV.addChangeListener(p_changement);
    		
    		m_panelEffPV.addChangeListener(new ChangeListener(){
    			public void stateChanged(ChangeEvent arg0) { 
    				System.out.println("ici 2"); }});
    		
    		m_panelEffCO.addChangeListener(p_changement);
    		m_panelEffTE.addChangeListener(p_changement);
    		m_panelEffRE.addChangeListener(p_changement);
    		m_panelEffDegat.addChangeListener(p_changement);
    		m_panelEffReussite.addChangeListener(p_changement);
    		m_panelEffResistance.addChangeListener(p_changement);
    		m_panelEffPP.addChangeListener(p_changement);
    		System.out.println("Fin addChangedListener");
    	}
    	
    	public static void main(String[] args) {
    		System.out.println("\n\n\n\n\n\n\n\nDebut programme");
    
    		JFrame toto = new JFrame();
    		toto.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		
    		toto.setSize(800,700);
    		toto.setLocationRelativeTo(null);
    		
    		JPanelEffet m = new JPanelEffet("test nom 1",-500,101,25,50,0,0,0,100,7,8,9);
    		
    		toto.getContentPane().setLayout(new FlowLayout());
    		toto.getContentPane().add(m,BorderLayout.CENTER);
    		toto.setVisible(true);
    		toto.pack();
    		
    		System.out.println("\nFin programme");
    	}
    }

    Voici le résultat :

    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
     
     
    Debut programme
    init
    init
     
    initListener
    Debut addChangedListener
    Fin addChangedListener
    Debut addChangedListener
    Fin addChangedListener
     
    initListener
    Debut addChangedListener
    Fin addChangedListener
    Debut addChangedListener
    Fin addChangedListener
     
    initListener
    Debut addChangedListener
    Fin addChangedListener
    Debut addChangedListener
    Fin addChangedListener
     
    Fin programme
     
    ici1
    ici1
    ici1
    On vois bien que l'on passe dans la méthode qui doit initialiser les listeners.
    La méthode pour cré le listener (en rouge) est identique dans le constructeur et dans la méthode dédié.
    Mais au final, c'est la première qui est utilisé !!! "ici1" au lieu de "ici2"

  7. #7
    Membre éclairé
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2006
    Messages
    350
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2006
    Messages : 350
    Par défaut
    Le fait que l'on voit l'affichage lié lors de la construction montre bien que c'est le bon objet qui récupère l'action non ?
    Donc normalement ca devrait être bon ...


    J'ai beau relire dans tous les ses je ne vois pas !!!! Je sais pas ou elle est mon entoure les poules mais elle y est !!!!

  8. #8
    Membre éclairé
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2006
    Messages
    350
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2006
    Messages : 350
    Par défaut
    Comme prévu, l'erreur était bien dans ma classe !!! Mais pas la ou je pensais !!!

    Les ecouteurs marchent très bien !!!

    Donc le soucis venait d'ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    m_carEffet = new CaracteristiqueJoueur( p_nom, 0, p_PV, 0, p_CO, p_TE, p_RE, p_degat, p_touche, p_resistance,  l_carArmure);

    Alors qu'il fallait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    m_carEffet = new CaracteristiqueJoueur( p_nom, 0, 0, p_PV, p_CO, p_TE, p_RE, p_degat, p_touche, p_resistance,  l_carArmure);
    Et oui même avec 20 rouble vous étiez loin de trouver !!!


    Bon ben encore désolé !!! Mais j'en pétais et le nez dedans ben c'est dur de trouver !!!


    Donc au plaisir ...

    PS : j'ai lancé un sujet pour mon stage, ou la par contre j'ai besoin d'avis !!! Merci
    []

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

Discussions similaires

  1. Listener sur une classe "distante"
    Par delire8 dans le forum Général Java
    Réponses: 15
    Dernier message: 25/02/2008, 18h55
  2. Réponses: 7
    Dernier message: 24/04/2007, 17h40
  3. Réponses: 7
    Dernier message: 17/04/2007, 13h51
  4. Probleme d'apel de fonction dans une autre classe
    Par freecell31 dans le forum MFC
    Réponses: 24
    Dernier message: 13/05/2006, 11h34
  5. Probleme de connection sur windows xp dans un domaine
    Par nemo69500 dans le forum Windows XP
    Réponses: 10
    Dernier message: 12/04/2006, 10h36

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