Je viens à vous car je tente désespérément, depuis plusieurs heures, de déplacer un rectangle avec les touches du clavier..
J'ai crée 4 classes dont :
-La classe main contenant l'affichage fenêtre avec une JFrame :
import java.awt.Color;
import javax.swing.JFrame;
public class Main {
public static void main(String[] args) {
JFrame Fenetre = new JFrame();
Scene scene = new Scene();
Fenetre.setTitle("Pong 1.0");
Fenetre.setSize(800, 600);
Fenetre.setResizable(false);
Fenetre.setDefaultCloseOperation(Fenetre.EXIT_ON_CLOSE);
Fenetre.setBackground(Color.BLACK);
Fenetre.setLocationRelativeTo(null);
Fenetre.setContentPane(scene);
Fenetre.setVisible(true);
}
}
-Ma classe Scene comprenant la JPanel incluant le dessin de la forme, les setters / getters :
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JPanel;
public class Scene extends JPanel {
int yPos = 20;
public Scene(){
Thread Timer = new Thread(new Timer());
this.addKeyListener(new Clavier());
this.setFocusable(true);
}
public void paintComponent(Graphics G){
G.setColor(Color.RED);
G.fillRect(10, yPos, 20, 100);
}
//getters
public int getyPos() { return yPos; }
//setters
public void setyPos(int yPos) { this.yPos = yPos; }
}
Ainsi que la classe Timer qui permet de rafraichir l'image à intervalles régulières :
public class Timer implements Runnable {
Scene scene;
public void run() {
try{
Thread.sleep(4);
scene.repaint();
}catch (InterruptedException IE) {}
}
}
Et enfin la classe Clavier permettant de gérer ( normalement ) les déplacements et autres événements claviers.
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
public class Clavier implements KeyListener {
Scene scene;
int yVar = 20;
public void keyPressed(KeyEvent e) {
if ( e.getKeyCode() == KeyEvent.VK_DOWN){
yVar++;
System.out.println(yVar);
scene.setyPos(yVar);
}
}
public void keyReleased(KeyEvent e) {
}
public void keyTyped(KeyEvent e) {}
}
Lorsque j'appui sur la flèche du bas du clavier ( donc VK_DOWN ), j'ai un disgracieux message d'erreur qui s'affiche, celui-ci est le suivant :
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at Clavier.keyPressed(Clavier.java:13)
at java.awt.Component.processKeyEvent(Unknown Source)
at javax.swing.JComponent.processKeyEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.KeyboardFocusManager.redispatchEvent(Unknown Source)
at java.awt.DefaultKeyboardFocusManager.dispatchKeyEvent(Unknown Source)
at java.awt.DefaultKeyboardFocusManager.preDispatchKeyEvent(Unknown Source)
at java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(Unknown Source)
at java.awt.DefaultKeyboardFocusManager.dispatchEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$500(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
Néanmoins, la variable s'incrémente belle et bien donc pourquoi cette erreur ?
J'ai également tenté de supprimer la classe Clavier et de gérer le KeyListener directement depuis ma classe Scene ( le JPanel ) mais il ne se passait rien quand j'appuyais sur la touche du bas, la variable s'incrémentait pourtant belle et bien mais aucun déplacement du rectangle...
Merci à tous d'avance pour votre très précieuse aide !
Ça ne peut pas fonctionner ainsi, puisque pour instancier ton objet Scene tu instancies ton objet Clavier qui instancie un objet Scene qui instancie un objet clavier qui instancie un objet Scene qui instancie un objet clavier qui instancie un objet Scene qui instancie un objet clavier qui instancie un objet Scene qui instancie un objet clavier qui instancie un objet Scene qui instancie un objet clavier qui instancie un objet Scene qui instancie un objet clavier qui instancie un objet Scene qui instancie un objet clavier qui instancie un objet Scene qui instancie un objet clavier qui instancie un objet Scene qui instancie un objet clavier qui instancie un objet Scene qui instancie un objet clavier qui instancie un objet Scene qui instancie un objet clavier qui instancie un objet Scene qui instancie un objet clavier qui instancie un objet Scene qui instancie un objet clavier qui instancie un objet Scene qui instancie un objet clavier qui instancie un objet Scene qui instancie un objet clavier qui instancie un objet Scene qui instancie un objet clavier... [StackOverflowError] <- Trop d'objets créés, plus de mémoire
Créé plutôt un constructeur pour Clavier :
public Clavier(Scene scene) {
this.scene = scene;
}
Et côté Scene, passe-la au constructeur de Clavier quand tu l'instancies :
public Scene(){
Thread Timer = new Thread(new Timer());
this.addKeyListener(new Clavier(this));
this.setFocusable(true);
}
GENIAL The_Javatar, tu es le MEILLEUR, merci infiniment ! :-D
A l'aide, je suis perdu avec paintComponent.
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
CTO Co-fondateur @ My Talent Manager : boostez votre carrière d'artiste | https://mytalentmanager.fr