[clos] Utilisation d'un SwingWorker Urgent . [Fermé]

Messages postés
66
Date d'inscription
vendredi 9 septembre 2011
Statut
Membre
Dernière intervention
4 juin 2012
- - Dernière réponse : cs_Julien39
Messages postés
6413
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
17 mai 2018
- 2 avril 2012 à 08:42
Bonjour,

Je suis debutant en Programmation Objet et en java .
Je me suis lancé dans la programmation d'un pac man .

Mais voila je butte sur un obstacle que je ne comprend pas vraiment .

voila le resumer de mes classes .

Fenetre : Création de l'affichage de la fenetre et du conteneur .
ModeleDuJeu : classe dissociant l'affichage , du calcul du jeu
Personnage : classe permettant d'afficher une image et me de la faire ce deplacer .


Enumeration Direction : enumere les differentes direction .

Pour le moment , je n'est pas programmer le deplacement en fonction de la fleche voulu .
je veus juste faire un petit test . Bon voila le probleme : lorsque je lance l'application ( sans le SwingWorker ) j'ai ce message d'erreur :
" Exception in thread "Thread-1" java.lang.NullPointerException
at Personnage.mouvement(Personnage.java:67)
at Personnage.calcul(Personnage.java:82)
at ModeleDuJeu.calcul(ModeleDuJeu.java:22)
at Fenetre$2.run(Fenetre.java:84)
at java.lang.Thread.run(Unknown Source) "

En faisant des recherches j'ai trouver une solution le SwingWorker , mais je ne sait pas vraiment l'utiliser ...
Lorsque je lance l'application avec je n'est plus le message d'erreur mais l'image ne ce deplace pas pour autant .
J'ai donc lancé le mode Debug , l'image ce deplace mais fait seulement le swingworker ( ou j'ai mis le calcul du jeu ) et par dans les choux.

donc le repaint ne s'execute pas .


voila les differentes classes en question que j'utilise .


Classe Fenetre :

import java.awt.Dimension;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingWorker;

import java.awt.Graphics;



public class Fenetre extends JFrame implements Constantes {

/**
 * 
 */
private static final long serialVersionUID = 1L;
private ModeleDuJeu modele;

//constructeur
public Fenetre(){
// titre de la fenêtre
super("Pac-Like By Ben");
// créer le modèle du jeu
this.modele = new ModeleDuJeu();
// fermeture de l'application lorsque la fenêtre est fermée
setDefaultCloseOperation(EXIT_ON_CLOSE);
// pas de redimensionnement possible de la fenêtre
setResizable(false);
// créer un conteneur qui affichera le jeu
final JPanel content = new JPanel(){

/**
 * 
 */
private static final long serialVersionUID = 1L;

@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
// affichage du modèle du jeu
Fenetre.this.modele.affichage(g);
}


};
// dimension de ce conteneur 
content.setPreferredSize(new Dimension( NBRE_DE_COLONNES * CASE_EN_PIXELS,
NBRE_DE_LIGNES * CASE_EN_PIXELS));
// ajouter le conteneur à la fenêtre
setContentPane(content);



// Créer un thread infini
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
// gestion de l'EDT eventDispatchThread

SwingWorker sw = new SwingWorker() {

protected Object doInBackground() throws Exception {
//content.repaint();
                        // temporisation
//Fenetre.this.modele.calcul();
try {

Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();

}

return null ;
}

};// fin du SwingWorker
 sw.execute();
while (true) { // boucle infinie
// à chaque fois que la boucle est exécutée, la
// méthode de calcul du jeu est appelée.
// Comme la boucle est infinie, la méthode de calcul
// sera appelée en cycle perpétuel.

Fenetre.this.modele.calcul();
// demander à l'EDT de redessiner le conteneur
content.repaint();
// temporisation
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();

}

}
}
});
// lancer le thread
thread.start();

}

// Lancement du jeu 
public static void main(String[] args) {
// création de la fenêtre , instenciation
Fenetre fenetre = new Fenetre();
// dimensionnement de la fenêre "au plus juste" suivant
// la taille des composants qu'elle contient
fenetre.pack();
// centrage sur l'écran
fenetre.setLocationRelativeTo(null);
// affichage
fenetre.setVisible(true);

}
}






Classe ModeleDuJeu

import java.awt.Graphics;

public class ModeleDuJeu {

private Labyrinthe lelabyrinthe;
private Nourriture lanourriture;
private Personnage leperso;

public ModeleDuJeu() {

this.lelabyrinthe = new Labyrinthe();
this.lanourriture = new Nourriture();
this.leperso = new Personnage();

}

// le calcul du jeu
    public void calcul(){
    	
    	this.lelabyrinthe.calcul();
    	this.lanourriture.calcul();
    	this.leperso.calcul();
    }
    
    
    
    // le dessin graphique du jeu
    public void affichage(Graphics g) {
    	 this.lelabyrinthe.affichage(g);
    	 this.lanourriture.affichage(g);
    	 this.leperso.paintComponent(g);
    	 
    }

}


Classe Personnage :

import java.awt.Graphics;
import java.awt.Image;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JPanel;



public class Personnage extends JPanel implements Constantes {

/**
 * 
 */
private static final long serialVersionUID = 1L;
private Image img = null;
private Direction direction;
private int posX=22*CASE_EN_PIXELS, posY=23*CASE_EN_PIXELS;

public void paintComponent(Graphics g){

try {
img= ImageIO.read(new File("pac2.png"));
g.drawImage(img, posX, posY ,this);
} catch (IOException e){
e.printStackTrace();
}
this.direction = Direction.VERS_LA_GAUCHE;

}



public void personnage(int posX, int posY){
this.posX=posX;
this.posY=posY;
}

public void personnage(){
this.posX=330;	 
this.posY=345;
}

public void setPosX(int x){
if (x<=0) 
x=0;
this.posX=x;
}

public void setPosY(int y){
if (y<=0) 
y=0;
this.posY=y;
}

public int getPosX(){
return this.posX;
}
public int getPosY(){
return this.posY;
}

private void mouvement(){

for (int i= 0; i< Constantes.CASE_EN_PIXELS; i++)
{
switch (this.direction){

case VERS_LA_GAUCHE:				
this.setPosX(this.getPosX()-1);
break;
case VERS_LA_DROITE:				
this.setPosX(this.getPosX()+1);
break;
}

}
}

public void calcul() {

mouvement();
// calcul du personnage
}









}


Quelqu'un peut-il m'aider ??
Merci d'avance
Afficher la suite 

1 réponse

Messages postés
6413
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
17 mai 2018
250
0
Merci
Salut,

Codes-Sources est un site communautaire où des bénévoles apportent de l'aide à ceux qui le demandent. Nous ne demandons pas grand chose en retour : juste un peu de reconnaissance et de respect.
Venir poser une question sur le forum en disant que c'est urgent est un manque de respect : qu'est-ce que ca t'apporte de préciser que c'est urgent ? Tu crois qu'en disant cà tu seras prioritaire par rapport aux autres membres ? Tu crois qu'on va se dépêcher de te répondre parce que tu es dans l'urgence ?

Et bien non, bien au contraire ! Dire que c'est urgent ne nous donne vraiment pas envie d'aider. Nous avons tous nos tracas quotidiens, avec nos patrons qui nous disent qu'il leur faut telle fonctionnalité pour demain matin à 8 h (si ce n'est pour la veille). Alors je traque tout ceux qui demandent de l'aide de façon urgente histoire de bien leur faire comprendre qu'on y gagne rien à aider les gens, alors le moins que tu peux espérer, c'est de trouver quelqu'un qui veuille bien t'aider, l'urgence elle n'est que pour toi, et surtout pas pour nous !

Sujet clos.