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

Interfaces Graphiques en Java Discussion :

Ecouteur sur JButton qui ne fonctionne pas


Sujet :

Interfaces Graphiques en Java

  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Octobre 2010
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 72
    Par défaut Ecouteur sur JButton qui ne fonctionne pas
    Bonjour à tous,
    Je viens solliciter votre aide car je me casse la tête sur un problème d'écouteur depuis plusieurs jours.

    Mon application est une sorte de jeu de cartes. Elle contient un JPanel (inclus dans un JScrollPane, pour avoir une ScrollBar), qui peut contenir différents boutons représentant des cartes du jeu (qui dérivent de JButton).
    En fait, de base, le JPanel n'est pas visible et ne contient aucun bouton. Si la touche F1 est appuyée, mon application ajoute dans le JPanel les cartes du joueur 1, puis l'affiche de la manière suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    if (e.getKeyCode() == e.VK_F1) {
    	this.panelHand.SetCards(this.players.get(0).getHand()); // On définit les cartes du panel comme celles du joueur 1
    	this.panelHand.setVisible(true);
    	this.panelHand.paintImmediately(getBounds()); // Redessiner le panel (car c'est la méthode paintComponent du panel qui va ajouter les cartes, ce qui est nécessaire avant d'appeler GetVarButtons pour ajouter les écouteurs)
    	this.panelHand.validate();
    	this.AddActionListener(this.panelHand.GetVarButtons());
    }
    J'ajoute également des écouteurs sur chaque carte :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public void AddActionListener(ArrayList<JButton> _buttons) {
    	for (JButton button : _buttons) {
    		button.addActionListener(this);
    	}
    }
    Mon problème avec ce code est que lorsque je clique sur un bouton représentant une carte, rien ne se passe, comme ci je n'avais pas ajouté d'écouteur à mes boutons...
    Par exemple, lorsque je clique sur un bouton, le programme n'affiche rien, malgré ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public void actionPerformed(ActionEvent e) {
    	System.out.println("Action");
    }
    Mon problème peut-il venir du fait que pour mes boutons j'ai créé une classe qui hérite de JButton, et non pas JButton directement ?

    Merci d'avance !

  2. #2
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2008
    Messages
    1 190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 1 190
    Par défaut
    Soit tu ne passes pas dans ton code pour ajouter les écouteurs, soit ta liste de bouton est vide quand tu y passes, soit dans button.addActionListener(this); this représente une classe qui a une méthode actionPerformed vide.

    Éventuellement tu réinitialises ou efface peut être les écouteurs après les avoir ajoutés.

  3. #3
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    540
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2009
    Messages : 540
    Par défaut
    Citation Envoyé par Morgan7469 Voir le message

    Mon problème peut-il venir du fait que pour mes boutons j'ai créé une classe qui hérite de JButton, et non pas JButton directement ?

    Merci d'avance !
    Non, cela doit fonctionner sans problème.

    Par contre, es-tu déjà certain que

    Citation Envoyé par Morgan7469 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public void AddActionListener(ArrayList<JButton> _buttons) {
    	for (JButton button : _buttons) {
    		button.addActionListener(this);
    	}
    }
    est réellement éxécuté ?
    Vérification par une trace

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

    Informations forums :
    Inscription : Octobre 2010
    Messages : 72
    Par défaut
    J'ai ajouté des affichages un peu partout :
    - Je passe bien dans ma méthode AddActionListener(ArrayList<JButton> _buttons)
    - Dans cette méthode, ma liste n'est pas vide, je boucle bien autant de fois que le joueur a de cartes
    - Ma classe représentée par this implémente bien la méthode actionPerformed(ActionEvent e)

    Je vais voir si mes écouteurs ne sont pas réinitialisés quelque part...

  5. #5
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    540
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2009
    Messages : 540
    Par défaut
    D'accord avec deathness

    Une autre chose (je pense inutile mais on ne sait jamais), la classe en question (this) implémente bien ActionListener ?

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

    Informations forums :
    Inscription : Octobre 2010
    Messages : 72
    Par défaut
    Oui bien sûr !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public class Game extends JFrame implements ActionListener, KeyListener, MouseListener
    J'ai d'autres panels dans ma fenêtre, et je n'ai aucun souci avec mes écouteurs concernant les boutons de ces panels.

  7. #7
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    540
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2009
    Messages : 540
    Par défaut
    Est-ce que tu affiches le bouton sur un ojbjet autre qu'un JPanel ou scrollPane ? Il arrive parfois que le bouton soit positionné sur un autre objet que ce soit cet autre objet qui reçoit l'action du clic et non le bouton

  8. #8
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Octobre 2010
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 72
    Par défaut
    Mes boutons sont bien positionnés sur un JPanel, positionné dans un JScrollPane.
    En plus, quand je clique sur le bouton, je le vois s'enfoncer donc j'imagine que c'est bien lui qui reçoit l'action du clic...

  9. #9
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    540
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2009
    Messages : 540
    Par défaut
    S'il s'enfonce, je pense que c'est bon.

    Pourrais-tu mettre tout le code de la classe pour voir ?
    Il doit y avoir quelque chose qui traine qui entrave l'action

  10. #10
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    540
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2009
    Messages : 540
    Par défaut
    Une fois que tu appuyé sur F1, tu peux afficher :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.out.printl(_buttons.get(0).getActionListerners()
    J'ai pris le 0 au hasard, tu peux aussi faire une boucle

  11. #11
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Octobre 2010
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 72
    Par défaut
    Le code de PanelHand, mon JScrollPane :
    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
    static class PanelHand extends JScrollPane {
     
    	private Hand currentHand; // La classe Hand contient des objets de type _Card (les cartes de la main du joueur)
     
    	public PanelHand() {
     
    		super(new PanelCards(), JScrollPane.VERTICAL_SCROLLBAR_NEVER, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
    		this.setLayout(new ScrollPaneLayout());
    		this.setBorder(BorderFactory.createTitledBorder("Main"));
    		this.setVisible(false);
    		this.currentHand = null;
    	}
     
    	public ArrayList<JButton> GetVarButtons() { // Retourne la liste des cartes
     
    		ArrayList<JButton> buttons = new ArrayList<JButton>();
    		ArrayList<CardComponent> cards = ((PanelCards)this.getViewport().getView()).getCards();
    		for (CardComponent card : cards) {
    			buttons.add((JButton)card);
    		}
    		return buttons;
    	}
     
    	public void AddCardComponent(_Card _card) { // Ajoute une carte
     
                    ((PanelCards)this.getViewport().getView()).AddCardComponent(_card);
    	}
     
    	public void SetCards(Hand _hand) { // Définit la main du joueur
     
    		this.currentHand = _hand;
    	}
     
    	public void paintComponent(Graphics g) { // Dessine les boutons à partir de la main du joueur
     
    		super.paintComponent(g);
    		((PanelCards)this.getViewport().getView()).RemoveCards();
    		if (this.currentHand != null && this.currentHand.getCards() != null) {
    			for (_Card card : this.currentHand.getCards()) {
    				this.AddCardComponent(card);
    			}
    		}
    	}
    Le code de PanelCards, mon JPanel :
    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
    static class PanelCards extends JPanel {
     
    	private ArrayList<CardComponent> cards;
     
    	public PanelCards() {
     
    		this.setLayout(new FlowLayout());
    		this.setVisible(true);
    		this.setPreferredSize(new Dimension(2000, 256));
    		this.cards = new ArrayList<CardComponent>();
    	}
     
    	public void AddCardComponent(_Card _card) { // Ajoute une carte au panel
     
    		this.cards.add(new CardComponent(this.cards.size() * CARD_SIZE_X, _card));
    		this.add(this.cards.get(this.cards.size() - 1), this.cards.size() - 1);
    	}
     
    	public ArrayList<CardComponent> getCards() { // Retourne les cartes du panel
     
    		return cards;
    	}
     
    	public void setCards(ArrayList<CardComponent> cards) { // Définit les cartes du panel
     
    		this.cards = cards;
    	}
     
    	public void RemoveCards() { // Supprime les cartes du panel
     
    		this.cards = new ArrayList<CardComponent>(0);
    		this.removeAll();
    	}
    }
    Le code de CardComponent, mon JButton :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    static class CardComponent extends JButton {
     
    	public CardComponent(int _posX, _Card _card) {
     
    		this.setLayout(null);
    		this.setBounds(_posX, 0, CARD_SIZE_X, CARD_SIZE_Y);
    		this.setIcon(new ImageIcon(PATH_IMAGES + _card.getId() + EXTANSION_IMAGES));
    		this.setVisible(true);
    	}
    }

  12. #12
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Octobre 2010
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 72
    Par défaut
    Citation Envoyé par oneagaindoguys Voir le message
    Une fois que tu appuyé sur F1, tu peux afficher :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.out.printl(_buttons.get(0).getActionListerners()
    J'ai pris le 0 au hasard, tu peux aussi faire une boucle
    J'avais déjà effectué cette vérification :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    System.out.println(this.panelHand.GetVarButtons().get(0).getActionListeners().toString());
    System.out.println(this.panelHand.GetVarButtons().get(0).getActionListeners().length);
    System.out.println(this.panelHand.GetVarButtons().get(0).getActionListeners()[0].toString());
    Affichage :

    [Ljava.awt.event.ActionListener;@2465a484
    1
    P_Game.Game[frame0,0,0,1024x768,invalid,layout=java.awt.BorderLayout,title=Munchkin,normal,defaultCloseOperation=EXIT_ON_CLOSE,rootPane=javax.swing.JRootPane[,3,25,1018x740,invalid,layout=javax.swing.JRootPane$RootLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=16777673,maximumSize=,minimumSize=,preferredSize=],rootPaneCheckingEnabled=true]

  13. #13
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    540
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2009
    Messages : 540
    Par défaut
    Je ne vois rien d'annormal dans ce code. Du coup, Game ressemble à quoi ?

  14. #14
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Octobre 2010
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 72
    Par défaut
    C'est une fenêtre avec différents panels...

    Lorsque je fais F1, le panel de la main s'affiche, avec les cartes du joueur 1.
    Si je fais barre espace les cartes sont supprimées du panel et le panel caché.
    Puis je fais F2, le panel de la main s'affiche à nouveau, mais cette fois avec les cartes du joueur 2.

    Le seul problème est que rien ne se passe lorsque je clique sur les cartes...

  15. #15
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    540
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2009
    Messages : 540
    Par défaut
    Pour moi il ne reste que le problème d'un listener retiré. Dans Game, tu dois avoir un endroit ou est retiré listener (je pense que tu le fais lorsque tu caches les cartes). Essaye d'enlever toute les instructions remove. Ensuite est ce que les boutons sont accessibles via d'autres classes ?
    Autrement si tu places le bouton directement sur la scrollpane ça fait toujours pareil.
    Il n'y a pas de mystère, il faut trouver l'instruction qui empèche de faire ce que l'on veut. actionPerformed est correcte

  16. #16
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Octobre 2010
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 72
    Par défaut
    Oui, j'ai l'impression que les écouteurs disparaissent, mais cela persiste même après avoir enlevé toutes les instructions de remove.

    J'ai remarqué que lorsque j'exécute le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.out.println(this.panelHand.GetVarButtons().get(0).getActionListeners().length);
    juste après avoir ajouté les écouteurs, toujours dans ma méthode keyPressed, l'écouteur est présent (affichage : 1).

    Par contre, si j'exécute le même code en dehors de la méthode keyPressed, l'écouteur n'est pas présent (affichage : 0).

    Serait-il possible que cela vienne du fait que le panel où sont positionnées les cartes est redessiné après avoir ajouté les écouteurs ?

  17. #17
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    540
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2009
    Messages : 540
    Par défaut
    Citation Envoyé par Morgan7469 Voir le message
    Serait-il possible que cela vienne du fait que le panel où sont positionnées les cartes est redessiné après avoir ajouté les écouteurs ?
    Non, et heureusement j'ai envie de dire...

    Quelles seraient les raisons pour lesquelles serait utilisé ?

    Pour vérifier s'il s'agit bien des mêmes boutons qui sont utilisés, compare les adresses des boutons avant et après. Si l'adresse du bouton 0 dans l'arraylist change, c'est qu'il y a effectivement un reconstruction de l'objet

  18. #18
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Octobre 2010
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 72
    Par défaut
    Si en fait l'erreur vient de ma méthode paintComponent !

    Je force le repaint() lorsqu'on appuye sur la touche F1 pour qu'il dessine les cartes dans le panel, en prenant soin de supprimer les cartes déjà présentes avec RemoveCards() (qui peuvent appartenir à un autre joueur).

    Le problème c'est qu'en sortant de la méthode keyPressed, le programme fait un repaint() et supprime/affiche les cartes du panel. Les écouteurs sont donc supprimés !

    Je pense que je vais résoudre mon problème en ajoutant les écouteurs dans la méthode paintComponent().

  19. #19
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    540
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2009
    Messages : 540
    Par défaut
    Oui ça pourrait suffire. Mais ne serait-ce pas plus propre de ne pas tout supprimer ?

  20. #20
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Octobre 2010
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 72
    Par défaut
    J'ai essayé et ça marche !
    La méthode paintComponent, qui affiche les cartes, ajoute aussi les écouteurs.

    Je ne vois pas ce que tu veux dire par "tout supprimer" ?

    En tout cas, je marque le problème comme résolu, et merci à tous pour votre aide !

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. float sur div qui ne fonctionne pas
    Par stephane543 dans le forum Mise en page CSS
    Réponses: 5
    Dernier message: 13/03/2010, 22h26
  2. [NASM] Int 21h qui ne fonctionne pas sur mon mini OS
    Par andromeda dans le forum Assembleur
    Réponses: 4
    Dernier message: 07/04/2007, 19h03
  3. Script JSP qui ne fonctionne pas sur n'importe quel poste
    Par vannary dans le forum Servlets/JSP
    Réponses: 15
    Dernier message: 18/12/2006, 12h56
  4. Requete qui ne fonctionne pas sur toutes les versions de MySQL
    Par goldorax113 dans le forum Requêtes
    Réponses: 2
    Dernier message: 06/06/2006, 12h04
  5. Code qui ne fonctionne pas sur Mac
    Par malbaladejo dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 14/01/2005, 12h08

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