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

 Java Discussion :

Problème avec la méthode repaint()


Sujet :

Java

  1. #1
    Membre à l'essai
    Homme Profil pro
    Enseignant
    Inscrit en
    Mai 2017
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Mai 2017
    Messages : 19
    Points : 11
    Points
    11
    Par défaut Problème avec la méthode repaint()
    Chose promise, chose due... me revoilà (rapidement) avec une nouvelle question.
    Déjà j'ai recodé entièrement mon projet pour que ça soit plus propre. Voilà le topic traitant de mon précédent problème : https://www.developpez.net/forums/d1...enetre-jframe/
    Maintenant que j'ai réglé ces soucis d'affichage, le problème est le suivant. Ma méthode repaint m'envoie l'erreur suivante :

    Code txt : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Exception in thread "Thread-1" java.lang.NullPointerException
    	at jeux2.Chrono.run(Chrono.java:8)
    	at java.lang.Thread.run(Unknown Source)

    Voici les différentes classes :
    Main :
    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
    package jeux2;
    import javax.swing.JFrame;
    import java.awt.Dimension;
     
    public class Main {
     
    	public static Fond fond;
     
    	public static void main(String[] args){
    		JFrame fenetre = new JFrame("Test");
    		fenetre.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		fenetre.setSize(new Dimension(1920, 1200));
    		fenetre.setLocationRelativeTo(null);
    		fenetre.setResizable(false);
    		fenetre.setAlwaysOnTop(false);
    		fenetre.setUndecorated(true);
    		Fond fond = new Fond();
    		fenetre.setContentPane(fond);
    		fenetre.setVisible(true);    
    	}
    }
    Fond :
    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
    package jeux2;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.Image;
    import java.io.File;
    import java.io.IOException;
     
    import javax.imageio.ImageIO;
    import javax.swing.JPanel;
     
    public class Fond extends JPanel { 
     
    	private static final long serialVersionUID = 2290215993065771323L;
     
    	public int x = 0;
    	public int y = 0;
    	public int dx = 0 ;
    	public int dy = 0;
     
    	public Image fond;
    	public Image curseur;
     
    	public Fond(){
    		super();
    		this.dx = 0;
    		this.addKeyListener(new clavier());
     
    		try{
    		this.fond = ImageIO.read(new File("C:/Users/Askiarsh/Desktop/eclipse/jeux2/src/jeux2/img/earth_map_ocean_continents_1920x1200.jpg"));
    		this.curseur = ImageIO.read(new File("C:/Users/Askiarsh/Desktop/eclipse/jeux2/src/jeux2/img/test.png"));
    		}catch(IOException e){
    			System.out.println("exception");
    		}
    		Thread chrono = new Thread(new Chrono());
    		chrono.start();
    	}
     
     
    	public void paintComponent(Graphics g){
    		super.paintComponent(g);
    		Graphics g2 = (Graphics2D)g;
    		g2.drawImage(this.fond,0,0,null);
    		g2.drawImage(this.curseur,100,100,null);
    	}
    // j'ai viré les get et set pour une meilleure lisibilité

    Curseur :
    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
    package jeux2;
    import java.awt.Graphics;
    import java.awt.Image;
    import java.io.File;
    import java.io.IOException;
     
    import javax.imageio.ImageIO;
    import javax.swing.JComponent;
     
     
    public class Curseur extends JComponent{
     
    	private static final long serialVersionUID = 8868691716373117721L;
     
    	public int x = 0;
    	public int y = 0;
    	public int dx = 0 ;
    	public int dy = 0;
     
    		public void paintComponent(Graphics g){
    		    try {
    		    	Image img = ImageIO.read(new File("C:/Users/Askiarsh/Desktop/eclipse/jeux2/src/jeux2/img/test.png"));
    		    	this.deplacement();
    		    	g.drawImage(img, x, y, this);
    		    } catch (IOException e) {
    		      e.printStackTrace();
    		    }
    		}
    Clavier :
    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
    package jeux2;
    import java.awt.event.KeyEvent;
    import java.awt.event.KeyListener;
     
    public class clavier implements KeyListener{
     
    	@Override
    	public void keyPressed(KeyEvent e) {
    		if(e.getKeyCode() == KeyEvent.VK_Z){
    			Main.fond.setDx(1);
    		};
    		if(e.getKeyCode() == KeyEvent.VK_S) ;
    		if(e.getKeyCode() == KeyEvent.VK_Q) ;
    		if(e.getKeyCode() == KeyEvent.VK_D) ;
    	}
     
    	@Override
    	public void keyReleased(KeyEvent arg0) {
    		// TODO Auto-generated method stub
     
    	}
     
    	@Override
    	public void keyTyped(KeyEvent arg0) {
    		// TODO Auto-generated method stub
     
    	}
     
    }
    Et enfin, la classe chrono d'où provient l'erreur :
    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
    package jeux2;
    
    public class Chrono implements Runnable{
    	private int PAUSE = 3;
    	@Override
    	public void run() {
    			while(true){
    				Main.fond.repaint();
    				System.out.println("test");
    				try {
    					Thread.sleep(PAUSE);
    				} catch (InterruptedException e) {}
    				}
    			}
    	}
    Merci d'avance pour vos réponses.

  2. #2
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Ben c'est clairement indique que tu manipules un truc null a la ligne 8 de ta classe Chrono...
    Pendant ce temps la, dans ton Main tu fais Fond fond = new Fond(); donc du coup Main.fond vaut toujours null.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  3. #3
    Membre à l'essai
    Homme Profil pro
    Enseignant
    Inscrit en
    Mai 2017
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Mai 2017
    Messages : 19
    Points : 11
    Points
    11
    Par défaut
    Oui je vois bien que je manipule un truc null , c'est ce que me dis l'erreur. Simplement je ne vois pas en quoi Main.fond est null ... Justement je construis l'objet fond avec la méthode Fond() ... du coup ça ne peux pas créer un truc null ....
    Il y a visiblement un truc qui m'échappe. Je veux bien une explication (voir une solution, mais surtout l'explication ).
    Merci d'avance.

  4. #4
    Membre chevronné
    Homme Profil pro
    Dév. Java & C#
    Inscrit en
    Octobre 2002
    Messages
    1 413
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Dév. Java & C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 413
    Points : 1 993
    Points
    1 993
    Par défaut
    Bonjour,

    L'explication est assez simple. Le thread est démarré avant que Main.fond soit assigné.

    Bien le bonjour chez vous
    Jowo

  5. #5
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Et si tu relisais ma réponse en réfléchissant plus de 2 secondes ?
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  6. #6
    Membre à l'essai
    Homme Profil pro
    Enseignant
    Inscrit en
    Mai 2017
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Mai 2017
    Messages : 19
    Points : 11
    Points
    11
    Par défaut
    D'accord donc , Monsieur le Modérateur Rédacteur Spécialiste de l'Information Technologique :
    1. L'informatique c'est pas mon métier. Je débute. Je lis ta réponse et visiblement elle n'est pas assez claire pour que je le comprenne. D'autant que je te répond en avançant des arguments et en précisant qu'il y a qq chose qui doit me manquer : c'est à dire une notion de base
    2. J'ai peut être pas bien lu ta réponse mais visiblement tu fait la même chose avec mes messages.
    3. ça fait une heure que j'essaye de manipuler mon code dans le sens que tu indique sans résultat. Pas deux minutes.
    EDIT : Tu me dis que Main.fond renvoie un truc null. Je te répond que je ne comprends pas pourquoi puisque je l'initialise avec la méthode Fond() dans la classe Main. Donc visiblement y'as une erreur de logique dans ce que je viens de dire. Il suffirait de m'expliquer cette erreur plutôt que d'être condescendant...




    Jowo :
    merci de ton explication.
    Je vois l'idée mais pourtant Main.fond est appelé avant le thread (en tout cas dans le texte ^^) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Main.fond.repaint();
    				                                                                                                             System.out.println("test");
    				                                                                                                             try {
    				                                                                                                             	Thread.sleep(PAUSE);
    				                                                                                                             } catch (InterruptedException e) {}
    				                                                                                                             }

  7. #7
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Citation Envoyé par bouye Voir le message
    tu fais Fond fond = new Fond(); donc du coup Main.fond vaut toujours null.
    Et accessoirement c'est ce aussi vers quoi pointe la réponse de Jowo...

    Tu as déclaré une variable nommée fond qui est locale à la méthode ; à aucun moment tu n'as initialisé le membre fond de la classe Main...
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  8. #8
    Membre à l'essai
    Homme Profil pro
    Enseignant
    Inscrit en
    Mai 2017
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Mai 2017
    Messages : 19
    Points : 11
    Points
    11
    Par défaut
    Déjà comme dis précédemment : " je ne vois pas en quoi Main.fond est null ... Justement je construis l'objet fond avec la méthode Fond() ... du coup ça ne peux pas créer un truc null .... "
    Ensuite je suis bien obligé d'intialiser fond afin d'utiliser setContentPane juste après... Donc même si je comprends pourquoi Main.fond est null, je ne saurais pas comment faire autrement vu la façon dont est écrit le code.
    EDIT : je n'avais pas vu l'interprétation que tu donne de la réponse de JOWO. C'est déjà plus clair. Je vais voir ce que je peux faire.
    EDIT 2: j'avais déclaré fond sans l'initialiser dans la classe Main. C'est chose faite et je n'ai plus l'erreur. Du coup merci des réponses Jowo et Bouye.

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

Discussions similaires

  1. [débutant] Problème avec la méthode "repaint"
    Par Mag007 dans le forum Langage
    Réponses: 2
    Dernier message: 29/03/2007, 21h35
  2. Problème avec la méthode request.form()
    Par sam.fet dans le forum ASP
    Réponses: 2
    Dernier message: 11/08/2006, 17h11
  3. [POO] Problème avec setInterval/méthodes d'écriture
    Par Lpu8er dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 18/07/2006, 15h37
  4. problème avec la méthode getElementById() dans Firefox
    Par matrouba dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 19/12/2005, 08h55
  5. Problème avec la méthode pack()
    Par tomca dans le forum Langage
    Réponses: 5
    Dernier message: 15/09/2005, 10h58

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