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".
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) {
}
});
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
[~ # ~] mise à jour [~ # ~] remarquez.
Paint
de JPanel
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.
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) {
}
}
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.
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