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 :

Cliquer sur un JButton bloque la classe KeyListener


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2015
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2015
    Messages : 34
    Par défaut Cliquer sur un JButton bloque la classe KeyListener
    Re-salutations à tous,

    Lors de mes problèmes d'animations, je les ai résolus en créant un boucle dans laquelle j'ai mis deux méthodes, update et render, update s'occupait de mettre à jour les coordonnées et render de l'affichage. Tout se passait très bien le problème était réglait.

    J'ai donc commencé à ajouter des boutons, mais lors de l'ajout du premier bouton, surprise: Il n'est plus possible de bouger le personnage. Après plusieurs tests, j'avais pensé que le problème venait du fait que les conditions contenant l'incrémentation de la position de mon personnage n'étaient plus lues, c'était en partie vrai, le fait est que la classe dans laquelle j'ai implémenté KeyListener n'était plus du tout lu, et ce, juste en cliquant sur le bouton! C'est vraiment un mystère! C'est la première fois que je n'ai plus aucune piste à suivre, c'est pourquoi, après maintes efforts et maintes recherches, je suscite votre aide et votre expérience!

    Voici les données essentielles:

    La classe bouton a été en quelque sorte personnalisée, comme ci-contre:

    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
    package rpg1.FortoChronicle.r1;
     
    import java.awt.Graphics;
     
    import javax.swing.Icon;
    import javax.swing.ImageIcon;
    import javax.swing.JButton;
     
    public class Bouton extends JButton {
     
     
    		//private ImageIcon bouton;
    		private String link;
    		private int x, y;
     
    		public Bouton(String link, int x, int y)
    		{
    			this.link = link;
    			this.x = x;
    			this.y = y;
     
    			Icon icone=new ImageIcon(link);
    			this.setIcon(icone);
    		}
     
     
     
    }
    La classe KeyListener est assez simple:
    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
    package rpg1.FortoChronicle.r1;
     
     
    import java.awt.event.KeyEvent;
    import java.awt.event.KeyListener;
     
    public class KeyBoardControl implements KeyListener 
    {
     
    	public static boolean up = false;
    	public static boolean down = false;
    	public static boolean left = false;
    	public static boolean right = false;
    	public static boolean espace = false;
     
    	public KeyBoardControl()
    	{
     
    	}
    	public void keyPressed(KeyEvent e) {
    		if(e.getKeyCode() == 38) 
    		{ 
    			up = true; 
    		}
    		if(e.getKeyCode() == 40) 
    		{
    			down = true;
    		}
    		if(e.getKeyCode() == 37) 
    		{
    			left = true;
    		}
    		if(e.getKeyCode() == 39) 
    		{
    			right = true;
    		}
    		if(e.getKeyCode() == 32)
    		{
    			espace = true;
    		}
    	}
     
    	public void keyReleased(KeyEvent e) {
    		if(e.getKeyCode() == 38) 
    		{
    			up = false; 
    		}
    		if(e.getKeyCode() == 40) 
    		{
    			down = false;
    		}
    		if(e.getKeyCode() == 37) 
    		{
    			left = false;
    		}
    		if(e.getKeyCode() == 39) 
    		{
    			right = false;
    		}
    		if(e.getKeyCode() == 32) 
    		{
    			espace = false;
    		}
     
    	}
     
    	public void keyTyped(KeyEvent e) {
     
     
    	}
     
    }
    Là où est contrôlé mon personnage au cas où:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    if(KeyBoardControl.up && !Frame.failed && Player.executMove != false) { Player.pY--; Player.move = true; }
    		if(KeyBoardControl.down && !Frame.failed && Player.executMove != false) { Player.pY++; Player.move = true; }
    		if(KeyBoardControl.left && !Frame.failed && Player.executMove != false) { Player.pX--; Player.move = true; }
    		if(KeyBoardControl.right && !Frame.failed  && Player.executMove != false) { Player.pX++; Player.move = true; }
    		if(KeyBoardControl.up == false && KeyBoardControl.down == false && KeyBoardControl.left == false && KeyBoardControl.right == false)
    		{
    			Player.move = false;
    		}
    Compte tenu que Player.executMove est toujours vrai pour l'instant, elle n'est pas traité autre part.
    Si vous avez besoin d'autres données n'hésitez pas à m'en demander!

    Information importante: Ce bug est valable même pour les JButton, donc boutons non modifiés.

    Merci beaucoup pour votre aide et votre dévouement!

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Salut,

    Ce n'est pas très clair tout ça et le code que tu montres n'est pas pertinent. On ne voit ni cette boucle d'animation dont tu parles (pas très normale, un Timer étant plus judicieux), ni la structure globale de l'UI (ou se trouve le bouton, le panneau où se passe l'animation...

    A mon avis ton problème est juste un problème de focus : le fait d'ajouter un bouton fait que c'est lui qui prend le focus (processus standard, normal, puisqu'un un bouton est censé être actionnable, contrairement à un panel). Comme les évenements clavier écoutables par KeyListener ne peuvent être reçu que par le composant qui a le focus, ton KeyListener, probablement enregistré sur le panel où s'affiche l'animation, ne reçoit plus d'évenements. Pour écouter globalement le clavier dans une UI avec des composants focusables, utilise un KeyEventDispatcher.

    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
    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Graphics;
    import java.awt.KeyEventDispatcher;
    import java.awt.KeyboardFocusManager;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.ComponentAdapter;
    import java.awt.event.ComponentEvent;
    import java.awt.event.KeyEvent;
     
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.Timer;
     
     
    public class Exemple extends JPanel {
     
    	private static final int SIZE=20;
    	private static final int SPEED=5;
     
    	private int x;
    	private int y;
     
    	private int dx;
    	private int dy;
     
    	public Exemple() {
    		Timer timer = new Timer(33, new ActionListener() {
     
    			@Override
    			public void actionPerformed(ActionEvent e) {
    				animate();
    			}
    		});
    		timer.start();
    		KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(new KeyEventDispatcher() {
     
    			@Override
    			public boolean dispatchKeyEvent(KeyEvent e) {
    				switch( e.getKeyCode() ) {
    				case KeyEvent.VK_UP:
    					dy=-getValue(e);
    					break;
    				case KeyEvent.VK_DOWN:
    					dy=getValue(e);
    					break;
    				case KeyEvent.VK_RIGHT:
    					dx=getValue(e);
    					break;
    				case KeyEvent.VK_LEFT:
    					dx=-getValue(e);
    					break;
    				}
    				return false;
    			}
     
    			private int getValue(KeyEvent e) {
    				return e.getID() == KeyEvent.KEY_PRESSED?SPEED:0;
    			}
     
    		});
            x=SIZE/2;
            y=SIZE/2;
            addComponentListener(new ComponentAdapter() {
     
    			@Override
    			public void componentResized(ComponentEvent e) {
    				if( x<SIZE/2 ) {
    					x=SIZE/2;
    				}
    				else if( x>getWidth()-SIZE/2 ) {
    					x=getWidth()-SIZE/2;
    				}
    				if( y<SIZE/2 ) {
    					y=SIZE/2;
    				}
    				else if( y>getHeight()-SIZE/2 ) {
    					y=getHeight()-SIZE/2;
    				}
    				repaint();
    			}
     
    		});
    	}
     
    	@Override
    	public void paint(Graphics g) {
    		super.paint(g);
     
    		g.setColor(Color.BLUE);
    		g.fillOval(x-SIZE/2, y-SIZE/2, SIZE, SIZE);
     
    	}
     
    	protected void animate() {
    		if ( dx!=0 || dy!=0 ) {
    			x+=dx;
    			y+=dy;
    			if( x<SIZE/2 ) {
    				x=SIZE/2;
    				dx=0;
    			}
    			else if( x>getWidth()-SIZE/2 ) {
    				x=getWidth()-SIZE/2;
    				dx=0;
    			}
    			if( y<SIZE/2 ) {
    				y=SIZE/2;
    				dy=0;
    			}
    			else if( y>getHeight()-SIZE/2 ) {
    				y=getHeight()-SIZE/2;
    				dy=0;
    			}
    			repaint();
    		}
    	}
     
    	public static void main(String[] args) {
     
    		JFrame frame = new JFrame("Exemple");
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
    		JPanel buttonPanel = new JPanel();
    		for(int i=0; i<3; i++) {
    			buttonPanel.add(new JButton("Bouton "+(i+1)));
    		}
    		frame.getContentPane().add(buttonPanel, BorderLayout.SOUTH);
     
    		Exemple panel = new Exemple();
    		frame.getContentPane().add(panel, BorderLayout.CENTER);
     
    		frame.setSize(600, 400);
    		frame.setLocationRelativeTo(null);
    		frame.setVisible(true);
     
    	}
     
    }
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2015
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2015
    Messages : 34
    Par défaut
    Super, merci beaucoup à toi Joël! Oui c'est vrai que ça ne l'était point, mais tu as réussis à me fournir une réponse très pertinente, donc merci encore. Je vais tenter de décortiquer ce code, au vu qu'il fonctionne très bien, je trouverai ma réponse dedans à coup sûr.

    Bon courage à toi, et bonne journée! ,
    Shurkan.

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

Discussions similaires

  1. cliquer sur un bouton d'une application extérieure
    Par looc 6699 dans le forum API, COM et SDKs
    Réponses: 7
    Dernier message: 12/12/2005, 17h46
  2. [VB.NET]Cliquer sur une ligne du datagrid
    Par Dnx dans le forum ASP.NET
    Réponses: 1
    Dernier message: 02/11/2005, 14h26
  3. Conseil du compilo sur un destructeur d'une classe
    Par okparanoid dans le forum Langage
    Réponses: 2
    Dernier message: 20/07/2005, 20h11
  4. Site sur CD - javascript bloqué par SP2
    Par loutente dans le forum Général Conception Web
    Réponses: 16
    Dernier message: 17/05/2005, 14h22
  5. [VB6] Déplacer la form sans cliquer sur la barre de titre
    Par Ingham dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 14/11/2002, 02h09

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