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

EDT/SwingWorker Java Discussion :

Problème avec KeyListener


Sujet :

EDT/SwingWorker Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Décembre 2015
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

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

    Informations forums :
    Inscription : Décembre 2015
    Messages : 2
    Par défaut Problème avec KeyListener
    Bonjour/Bonsoir,

    Pour m'occuper, je suis entrain de réaliser une petite application JAVA qui permet de déplacer avec certaine touche un rectangle bleu situé à l'écran.

    J'ai réussie à faire ma JFrame avec le rectangle bleu, mais je n'arrive pas à faire déplacer le rectangle avec les touches. Pouvez-vous m'indiquer ou ce trouve l'erreur dans mon code.

    Merci.

    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
    public class Interface extends JPanel implements KeyListener{
     
    	public static JFrame jf = new JFrame();
    	static int width = 720;
    	static int height = 480;
    	static String title = "Moteur JFrame";
    	public int x = 50;
    	public int y = 50;
     
    	public static void main(String[] args) {
    		jf.setResizable(false);
    		jf.setTitle(title);
    		Interface i = new Interface();
    		jf.add(i);
    		jf.setSize(width, height);
    		jf.setLocationRelativeTo(null);
    		jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    	    jf.setVisible(true);
     
    		TimerTask task = new TimerTask()
    		{
    			@Override
    			public void run() 
    			{
    				jf.repaint();
    			}	
    		};
     
    		Timer timer = new Timer();
    		timer.scheduleAtFixedRate(task, 0, 20);	
    	}
     
    	public void Interface(){
    		addKeyListener(this);
    	}
     
     
    	public void paintComponent(Graphics g){
    		super.paintComponents(g);
     
    		g.setColor(Color.BLUE);
    		g.fillRect(x, y, 20, 20);
    	}
     
    	@Override
    	public void keyPressed(KeyEvent e) {
    		if(e.getKeyCode() == KeyEvent.VK_RIGHT){
     
    			System.out.println("Key Pressed: RIGHT");
    			x++;
     
    		}else if(e.getKeyCode() == KeyEvent.VK_LEFT){
     
    			System.out.println("Key Pressed: LEFT");
    			x--;
     
    		}else if(e.getKeyCode() == KeyEvent.VK_UP){
     
    			System.out.println("Key Pressed: UP");
    			y++;
     
    		}else if(e.getKeyCode() == KeyEvent.VK_DOWN){
     
    			System.out.println("Key Pressed: DOWN");
    			y--;
     
    		}
    	}
     
    	@Override
    	public void keyReleased(KeyEvent e) {
     
     
    	}
     
    	@Override
    	public void keyTyped(KeyEvent e) {
     
    	}
    }

  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 : 56
    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,

    Premièrement, tu as fait une erreur au niveau du constructeur de la classe Interface, en le typant void : en conséquence, ce n'est plus un constructeur pour la classe Interface, mais une méthode qui s'appelle Interface. Elle n'est donc jamais invoquée, et donc le KeyListener n'est pas enregistré.

    Ensuite, pour qu'un composant puisse recevoir les évenements clavier, il est nécessaire qu'il ait le focus : en effet, contrairement à la souris par exemple qui est localisée à l'écran, le clavier, lui, est global. Il n'est donc pas possible de définir quel composant à l'écran est censé réagir aux appuis de touches du clavier. Plutôt que de dire que tous les composants reçoivent les évenements, ce qui serait très problématique (imagine que dans un formulaire, en tapant une touche, tous les champs sont modifiés en même temps...), on dit qu'un composant va recevoir les évenements : pour ça, on lui donne le focus

    Pour qu'un composant puisse recevoir le focus, il faut qu'il soit prévu pour ça. Un champ texte (JTextField) est prévu naturellement pour faire de la saisie. Mais pas un JPanel. Donc il faut l'indiquer.

    (en détail, c'est un peu plus complexe : la fenêtre nouvellement ouverte prend le focus et le transmet à un de ses composant en utilisant des règles (un ordre entre les composants en gros, des règles de passage du focus d'un composant à l'autre en fonction de ce qu'on frappe...), seulement là, tu n'auras qu'un seul composant dans ta fenêtre, donc ce sera forcément celui-là qui aura le focus, dans la mesure où on va dire qu'il peut l'avoir).

    Donc, à la place de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public void Interface(){
    		addKeyListener(this);
    	}
    mets
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public Interface(){
    		setFocusable(true);
    		addKeyListener(this);
    }
    Accessoirement, tu as inversé le haut et le bas.
    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
    Candidat au Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Décembre 2015
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

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

    Informations forums :
    Inscription : Décembre 2015
    Messages : 2
    Par défaut
    Parfait, merci beaucoup

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

Discussions similaires

  1. Problème avec KeyListener
    Par Lyadrielle dans le forum Langage
    Réponses: 13
    Dernier message: 10/01/2014, 12h53
  2. Problème avec KeyListener
    Par mesbec dans le forum Général Java
    Réponses: 6
    Dernier message: 19/07/2013, 17h00
  3. Problème de rapidité avec KeyListener et repaint()
    Par Epiliptik dans le forum Composants
    Réponses: 3
    Dernier message: 14/06/2013, 19h40
  4. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 17h10

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