Partage
  • Partager sur Facebook
  • Partager sur Twitter

A l'aide, je suis perdu avec paintComponent.

    13 octobre 2016 à 15:29:26

    Bonjour à tous chers passionnés ! :-)

    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 !

    La bise !

    • Partager sur Facebook
    • Partager sur Twitter
      13 octobre 2016 à 16:52:59

      Problème d'instanciation regarde l'erreur et suis les instruction : (NullPointerException)  (Clavier.java:13)

      scene = new Scene();
      scene.setyPos(yVar);



      • Partager sur Facebook
      • Partager sur Twitter
      "Qui ne tente rien, n'a rien !"
        13 octobre 2016 à 17:53:24

        Salut Guatto,

        Merci pour ta réponse rapide, j'ai tenté d'instancier ma Scène dans ma classe Clavier tel que tu l'as fait, autrement-dit :

        public class Clavier implements KeyListener {
        	
        Scene scene = new Scene();

        Mais lorsque je lance mon programme, j'ai désormais comme erreur : 

        erreur



        mais j'obtiens, cette fois-ci, l'erreur suivante :

        • Partager sur Facebook
        • Partager sur Twitter
          14 octobre 2016 à 13:56:19

          Ç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);
          }



          • Partager sur Facebook
          • Partager sur Twitter

          cd514331234507.564a1d2324e4e.gifCTO Co-fondateur @ My Talent Manager : boostez votre carrière d'artiste | https://mytalentmanager.fr

            19 octobre 2016 à 22:43:01

            GENIAL The_Javatar, tu es le MEILLEUR, merci infiniment ! :-D
            • Partager sur Facebook
            • Partager sur Twitter

            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.
            • Editeur
            • Markdown