web-dev-qa-db-fra.com

Comment détecter une pression de touche dans Java

Mon fils (11 ans) qui apprend Java va entrer une question et du code. Il me dit qu'il n'a pas pu trouver la réponse à cette question sur le site. Vous allez lire ma version révisée de sa question. Merci beaucoup.

Comment puis-je détecter une pression de touche en Java, Mon IDE s'appelle Eclipse et j'ai créé quelques classes. J'ai trouvé le code à l'intérieur keyconfigofplayer d'Internet et l'ai changé en étendre la classe du joueur. Je le veux donc quand je maintiens une touche un rectangle ou un ovale se déplacera à travers l'écran, comment pourrais-je faire cela? Pour une raison quelconque, il ne tapera pas le code correctement, c'est pourquoi mes importations n'ont pas l'astérisque et le regard wierd. désolé. veuillez l'ignorer. Je ne peux pas résoudre ce problème :(. voici mon code:

code pour la fenêtre:

import javax.swing.*;
import Java.awt.*;

public class window {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        JFrame f = new JFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setVisible(true);
        f.setSize(600, 600);
        player p = new player();
        f.add(p);

        keyconfigofplayer key = new keyconfigofplayer();
        p.add(key);
        f.add(key);

    }
}

//this class is the player graphic

import javax.swing.*;
import Java.awt.*;

    public class player extends JPanel {

    int x = 50;
    int y = 50;

    public void Paint() {//This is where the graphic is painted to the screen
        repaint();
    }

    public void paintComponent(Graphics g) {
        //This is where the graphic is 'manufactured'
        super.paintComponent(g);
        g.setColor(Color.GREEN);
        int width = 20;
        int height = 20;
        g.fillRect(x, y, width, height);

        int width2 = 10;
        int height2 = 10;
        g.fillOval(x, y, width2, height2);

    }
}

//the keyconfigofplayer class(where i think the problems are):
//this class is the player graphic

import javax.swing.*;
import Java.awt.*;

    public class player extends JPanel {

    int x = 50;
    int y = 50;

    public void Paint() {//This is where the graphic is painted to the screen
        repaint();
    }

    public void paintComponent(Graphics g) {
        //This is where the graphic is 'manufactured'
        super.paintComponent(g);
        g.setColor(Color.GREEN);
        int width = 20;
        int height = 20;
        g.fillRect(x, y, width, height);

        int width2 = 10;
        int height2 = 10;
        g.fillOval(x, y, width2, height2);
    }
}

Les classes que j'ai essayé de bien commenter afin que vous sachiez ce que cela signifie. J'ai reçu le code de keyconfigofplayer de la chaîne youtube macheads101 comment programmer l'interface graphique dans Java épisode 12 ou 11 je pense. Je pense que mon problème n'est pas de mettre à jour l'image, mais de détecter quand la clé est pressé puis relâché. Alors peut-être que je devrais faire une boucle while en disant que: si cette touche est enfoncée, + 10 aux coordonnées x jusqu'à ce que ce soit fait et mettre à jour constamment la position. Je voudrais aussi demander, quand utiliser public, privé et nul? Je ne comprends pas ceux-ci :( et si j'ai fait le joueur étendu implémente la chose correctement. J'ai essayé de modifier soigneusement le code de macheads101, quand je l'ai copié exactement cela n'a pas fonctionné aussi. Donc je ne sais vraiment pas ce qui ne va pas. Je vous serais reconnaissant si vous répondiez à ma question et m'aidiez à modifier mon code. Au final, ce sera un jeu de tir, comme le jeu d'arcade "Space Invaders" ou "Dragon Shooter".

9
user3343497

En savoir plus sur Java.awt.event.KeyListener

Un code devrait ressembler à ceci:

    f.addKeyListener(new KeyListener() {
        @Override
        public void keyTyped(KeyEvent e) {
        }

        @Override
        public void keyPressed(KeyEvent e) {
            System.out.println("Key pressed code=" + e.getKeyCode() + ", char=" + e.getKeyChar());
        }

        @Override
        public void keyReleased(KeyEvent e) {
        }
    });
12
user3329098

Les interfaces graphiques sont donc pilotées par les événements. Tout ce qui se produit est entraîné par un événement. Une pression sur une touche est un événement. Un composant doit écouter les événements et faire quelque chose lorsque l'événement est déclenché. Vous pouvez en savoir plus sur la façon d'écrire différents auditeurs ici . Certains des écouteurs de base sont assez faciles à reconnaître (par leur nom) comme KeyListener ou MouseListener. ActionListener est également assez courant pour les pressions de bouton. Vous aurez envie de parcourir les tutoriels et d'apprendre les différents auditeurs.

Notez cependant qu'avec Swing, l'utilisation de KeyListener pose des problèmes de concentration, il est donc préférable d'utiliser les raccourcis clavier . Comme indiqué dans le didacticiel KeyListener:

Pour définir des réactions spéciales à des touches particulières, utilisez des liaisons de touches au lieu d'un écouteur de touches

Un tutoriel pour les raccourcis clavier peut être trouvé ici et un exemple peut être vu ici . Voici le gif de l'exemple, montrant le mouvement du rectangle avec une pression de touche à l'aide de raccourcis clavier

enter image description here


[~ # ~] mise à jour [~ # ~] remarquez.

  1. Ne remplacez pas la méthode Paint de JPanel
  2. Ne jamais appeler repaint() depuis l'intérieur d'un Paint/paintComponent méthode

    public void Paint() {//This is where the graphic is painted to the screen
        repaint();
    }
    

Débarrassez-vous complètement du code ci-dessus.

5
Paul Samsotha

Il y a une grande bibliothèque qui fonctionne bien et qui écoute les événements mondiaux. C'est la seule chose qui a fonctionné sans aucun problème pour moi: https://github.com/kwhat/jnativehook

Il saisit chaque événement du système, assez cool pour tout développement.

Vous pouvez l'utiliser comme ceci:

package main;

import org.jnativehook.GlobalScreen;
import org.jnativehook.NativeHookException;
import org.jnativehook.keyboard.NativeKeyEvent;
import org.jnativehook.keyboard.NativeKeyListener;

class MyKeyboard implements NativeKeyListener {

    public static void main(String[] args) {
        try {
            GlobalScreen.registerNativeHook();
        } catch (NativeHookException ex) {
            System.err.println("There was a problem registering the native hook.");
            System.err.println(ex.getMessage());

            System.exit(1);
        }

        GlobalScreen.addNativeKeyListener(new MyKeyboard());

        // Now press any keys and look at the output
    }

    @Override
    public void nativeKeyPressed(NativeKeyEvent e) {
    }

    @Override
    public void nativeKeyTyped(NativeKeyEvent nke) {
    }

    @Override
    public void nativeKeyReleased(NativeKeyEvent nke) {
    }

}
2
Rav

Je ne vois rien dans votre code qui écoute réellement les pressions sur les touches ou qui modifie la position de x et y. Le cercle ne se déplacera que si vous modifiez x et y, puis repeignez l'écran.

Vous avez configuré le panneau, etc. ici, mais n'avez en fait rien ajouté pour répondre à l'action de l'utilisateur. Vous devrez probablement ajouter un KeyListener quelque part pour répondre aux pressions de touches. Il s'agit probablement soit du didacticiel que vous effectuez, soit d'un didacticiel précédent ou ultérieur.

1
Tim B

KeyListener

Vous devriez placer son événement KeyListener dans la classe dont vous en avez besoin et non dans la méthode principale!

addKeyListener(new KeyListener() {
    public void keyPressed(KeyEvent e) {
        //This is where you want to implement your key!
        if(e.getKeyCode() == KeyEvent.VK_SPACE){
             //Fire Gun!
        }
        ....
    }

    public void keyReleased(KeyEvent e) { //I dont really use these!
    }

    public void keyTyped(KeyEvent e) { //I dont really use these!
    }
});

Plus d'informations sur les clés ici: KeyListeners


Public et privé:

Maintenant pour le public et le privé, il y a déjà une réponse sur StackOVerflow qui, je pense, fait assez bien le travail! ici


Fonctions/méthodes et annulation:

Quant à Void, il est utilisé dans des fonctions où vous ne souhaitez rien retourner! Je ne sais pas dans quelle mesure vous connaissez les fonctions mais permettez-moi de vous donner un exemple:

int sum;
public int addReturn(int x, int y){
    sum = x +y;
    return sum;
}

Ce que cela fait, c'est qu'il ajoute les deux entiers donnés comme x et y, puis renvoie la somme sous forme d'entier!

Ce que vous pouvez faire est:

int sum;
public void add(int x, int y){
    sum = x+ y;
}

Ici, vous ne retournez rien mais il stocke toujours x + y en somme!

Donc dans votre classe:

int Summation, x = 10, y = 10;
summation = addReturn(x,y); //<-- This will place summation = 10+10 = 20

Pour la fonction void, vous n'avez pas besoin de créer une variable car elle ne renvoie pas de valeur, elle définit plutôt la valeur dans la fonction. Il vous suffit de l'appeler

add(x,y);

Si vous avez besoin d'aide, commentez! :) Je trouve aussi génial que votre fils soit si intéressé par Java à un si jeune âge. Great Parenting: D

0
Shrey