Problème rafraichissement JLabel

Problème rafraichissement JLabel - Java - Programmation

Marsh Posté le 23-11-2009 à 12:34:10    

Bonjours, voila en fait je réalise le jeu du grinch, j'ai une grille avec sur cette grille des cadeaux placés au hasard dans les cases (JPanel) et je déplace un bonhomme avec les touches directionnelles. J'ai également un JPanel contenant le score sur la gauche. Le problème est que je n'arrive pas à rafraichir le JLabel du score pour mettre à jour le score lorsque le bonhomme touche un cadeau.  
 
j'ai pourtant écrit ceux-ci :  
 

Code :
  1. score = score + 5;
  2. //label du score
  3. JLabelScore.setText("Score : "+score);
  4. JLabelScore.repaint();


 
Mais sans résultat  :??:

Reply

Marsh Posté le 23-11-2009 à 12:34:10   

Reply

Marsh Posté le 23-11-2009 à 21:50:41    

Peut-être que tu bloques l'EDT de Swing?

Reply

Marsh Posté le 24-11-2009 à 08:48:19    

je ne sais pas du tout, di m'en plus, et aussi si tu as une solution parce que je ne vois pas =(.

Reply

Marsh Posté le 24-11-2009 à 09:33:44    

Et bien en gros ça signifie que, après le code que tu m'as montré, tu fais d'autres opérations blocantes dans le même thread et donc tu ne rends jamais la main à SwinG qui n'a pas l'occasion de redessiner ton interface graphique.
Les opérations blocantes doivent être faites dans des threads séparés.

Reply

Marsh Posté le 24-11-2009 à 13:26:47    

D'accord je comprend, le problème c'est que je n'utilise aucun thread tout simplement parce que je n'arrive pas à en créer pour mon JLabel, je ne saurai pas ou le placer dans mon code.
Voila le code entier de mon application avec à la ligne 350 le moment ou je veux rafraichir mon JLabel.
 

Code :
  1. import java.awt.Button;
  2. import java.awt.Color;
  3. import java.awt.Component;
  4. import java.awt.Dimension;
  5. import java.awt.event.ActionEvent;
  6. import java.awt.event.ActionListener;
  7. import java.awt.event.KeyEvent;
  8. import java.awt.event.KeyListener;
  9. import java.util.ArrayList;
  10. import java.util.EventListener;
  11. import java.util.HashMap;
  12. import java.util.List;
  13. import java.util.Map;
  14. import javax.swing.BorderFactory;
  15. import javax.swing.ImageIcon;
  16. import javax.swing.JFrame;
  17. import javax.swing.JLabel;
  18. import javax.swing.JLayeredPane;
  19. import javax.swing.JOptionPane;
  20. import javax.swing.JPanel;
  21. import javax.swing.JTextField;
  22. import javax.swing.JToolBar;
  23. import javax.swing.SwingUtilities;
  24. import javax.swing.border.Border;
  25. public class JLareyedPane extends JFrame implements KeyListener, ActionListener
  26. {
  27. //nom de l'utilisateur saisi à l'ouverture de l'application
  28. private String nom;
  29. //abscisse
  30. private int x = 5;
  31. //ordonnée
  32. private int y = 5;
  33. //nombre de cadeau qui sera implanté sur la grille
  34. private int nbCadeau;
  35. //abscisse et ordonnée des cases (JPanel) de la grille
  36. private int abscisse = 0;
  37. private int ordonnee = 0;
  38. //variable contenant le score du joueur
  39. private int score = 0;
  40. //Création du panel conteneur
  41. private JPanel pane = new JPanel();
  42. //label contenant l'image
  43. private JLabel grinch = new JLabel( new ImageIcon("image/test.jpg" ));
  44. //tableau de hachage qui nous permettra d'y créer chaque case de la grille ou panel avec un nom diférent
  45. private Map<String, JPanel> tabPanel = new HashMap<String, JPanel>();
  46. //tableau de hachage regroupant plusieurs cadeaux
  47. private Map<String, JLabel> tabCadeau = new HashMap<String, JLabel>();
  48. //texbox du nombre de cadeau
  49. private JTextField textFieldNbCadeau = new JTextField(20);
  50. //Tableau regroupant les nombres tirés au hasard
  51. private List<Integer> tableauTirage = new ArrayList<Integer>();
  52. //tableau des coordonnées X de tous les cadeaux
  53. private List<Integer> tableauX = new ArrayList<Integer>();
  54. //tableau des coordonnées X de tous les cadeaux
  55. private List<Integer> tableauY = new ArrayList<Integer>();
  56. //label contenant le score du joueur
  57. JLabel JLabelScore = new JLabel("Score : "+score);
  58. //barre d'outil
  59. JToolBar barreOutil = new JToolBar(); //instanciation d'une barre d'outil
  60. //JLayeredPane permet de superposer des composants les uns sur les autres
  61. JLayeredPane layeredPane = new JLayeredPane();
  62. //constructeur
  63. public JLareyedPane ()
  64. {
  65.  super();
  66.  //On initialise notre fenêtre
  67.  build();
  68.  this.addKeyListener(this);
  69. }
  70. //méthode qui construit la fenêtre
  71. private void build()
  72. {
  73.  //on récupère la valeur du nom entré au démarage du jeu
  74.  nom = afficheBienvenu();
  75.  //si l'utilisateur a saisi quelque chose
  76.  if(!nom.equals("" ))
  77.  {
  78.   setTitle("Jeu du Grinch" ); //On donne un titre à l'application
  79.   setSize(735,528); //on donne une taille à notre fenêtre
  80.   setLocationRelativeTo(null); //On centre la fenêtre sur l'écran
  81.   setResizable(true); //On ne permet pas le redimensionnement
  82.   setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //On dit à l'application de se fermer lors du clic sur la croix
  83.   setContentPane(buildContentPane()); //on défini le contenu du conteneur principal
  84.   genererGrille(); //on génère la grille du jeux  
  85.   setLayout(null); //on annule tout positionnement
  86.  }
  87.  //si l'utilisateur n'a rien saisi, on n'affiche rien
  88.  else System.exit(0);
  89. }
  90. public String afficheBienvenu()
  91. {
  92.  String nom = ""; //variable qui contiendra le nom saisi
  93.  String saisi; //variable qui contiendra la saisie de l'utilisateur
  94.  Boolean pasNom = true; //booléan initialisé a vrai tant qu'il n'a pas saisi de nom
  95.  try
  96.  {
  97.   while(pasNom)
  98.   {
  99.    //on affiche une boite de dialogue pour que l'utilisateur rentre son nom
  100.    saisi = JOptionPane.showInputDialog (null, "Saisissez votre prénom","Bienvenu au le jeu du grinch", JOptionPane.INFORMATION_MESSAGE) ;
  101.    //si l'utilisateur a saisi quelque chose
  102.    if(!saisi.equals("" ))
  103.    {
  104.     pasNom = false;
  105.     nom = saisi;
  106.    }
  107.    if (saisi.equals(null)) {} // sinon on ne fait rien  
  108.   }
  109.  }catch(NullPointerException npe)
  110.  {
  111.  }
  112.  return nom;
  113. }
  114. public void genererGrille()
  115. {
  116.  //création d'une bordure de couleur blanche
  117.  Border whiteline = BorderFactory.createLineBorder(Color.white,1);
  118.  //création de ma grille
  119.  //110 correspond au nombre de panel
  120.  for(int i=0; i < 110; i++)
  121.  {
  122.   //on fait appelle au tableau de hachage et on y insère chaque case (panel)
  123.   tabPanel.put("monPanel"+i, new JPanel());
  124.   tabPanel.get("monPanel"+i).setBounds(abscisse, ordonnee, 50, 50);
  125.   tabPanel.get("monPanel"+i).setBorder(whiteline);
  126.   tabPanel.get("monPanel"+i).setBackground(Color.black);
  127.   //on ajoute le JPanel au layeredPane
  128.   layeredPane.add(tabPanel.get("monPanel"+i));
  129.   //on change les coordonnées pour pouvoir placer les panels afin de former une grille
  130.   abscisse = abscisse + 50;
  131.   if(abscisse > 500)
  132.   {
  133.    ordonnee = ordonnee + 50;
  134.    abscisse = 0;
  135.   }
  136.  }
  137.  pane.add(layeredPane);
  138. }
  139. public void genererObstacle()
  140. {
  141.  //création d'un tableau de hachage pour mes obstacles
  142.  Map<String, JLabel> tabObstacle = new HashMap<String, JLabel>();
  143.  for(int i=0;i<10;i++)
  144.  {
  145.   tabObstacle.put("obstacle"+i, new JLabel( new ImageIcon("image/obstacle.jpeg" )));
  146.  }
  147. }
  148. public void genererCadeaux(int n)
  149. {
  150.  //création d'un tableau de hachage pour mes cadeaux
  151.  for(int i=0;i<n;i++)
  152.  {
  153.   tabCadeau.put("cadeau"+i, new JLabel( new ImageIcon("image/cadeau.gif" )));
  154.  }
  155.  //instanciation d'un tableau de liste
  156.  List<Integer> tableauTirage = new ArrayList<Integer>();
  157.  for (int i = 0; i < n; i++)
  158.  {
  159.   boolean retirer = true;
  160.   do {
  161.    int aleatoire = (int) (Math.random() * tabPanel.size());
  162.    if (!tableauTirage.contains(Integer.valueOf(aleatoire)))
  163.    {
  164.     tabPanel.get("monPanel"+aleatoire).add(tabCadeau.get("cadeau"+i));
  165.     //tabPanel.get("monPanel" + aleatoire).add(new JLabel(new ImageIcon("image/cadeau.gif" )));
  166.     tableauTirage.add(Integer.valueOf(aleatoire));
  167.     tableauX.add(tabPanel.get("monPanel"+aleatoire).getX());
  168.     tableauY.add(tabPanel.get("monPanel"+aleatoire).getY());
  169.     retirer = false;
  170.    }
  171.   } while (retirer);
  172.  }
  173. }
  174. public void effacerGrille()
  175. {
  176.  for(int i=0; i<tabPanel.size(); i++)
  177.  {
  178.   tabPanel.get("monPanel"+i).removeAll();
  179.  }
  180. }
  181. //construction du panel principal
  182. private JPanel buildContentPane()
  183. {
  184.  //on change la couleur du panel principal
  185.  pane.setBackground(Color.black);
  186.  //largeur/hauteur
  187.  layeredPane.setPreferredSize(new Dimension(550, 500));
  188.  layeredPane.setBounds(176, 0, 550, 500);
  189.  //on crée des bordure
  190.  Border whiteline = BorderFactory.createLineBorder(Color.white,1);
  191.  layeredPane.setBorder(whiteline);
  192.  //on positionne le grinch sur la fenêtre
  193.  grinch.setBounds(x, y, 25, 25);
  194.  layeredPane.add(grinch);
  195.  //barre d'outil
  196.  JToolBar barreOutil = new JToolBar(); //instanciation d'une barre d'outil
  197.  barreOutil.setLayout(null);
  198.  barreOutil.setBounds(0, 0, 175, 520); //on positionne et redimensionne
  199.  //label du nom du joueur
  200.  JLabel nomJoueur = new JLabel("Bienvenue "+nom);
  201.  nomJoueur.setBounds(20, 5, 400, 20);
  202.  barreOutil.add(nomJoueur);
  203.  //label "Difficulté du jeu"
  204.  JLabel difficulte = new JLabel("Difficulté du jeu" );
  205.  difficulte.setBounds(40, 40, 100, 20);
  206.  barreOutil.add(difficulte);
  207.  //label "nombre de cadeaux"
  208.  JLabel JLabelnbCadeau = new JLabel("Nombre de cadeaux" );
  209.  JLabelnbCadeau.setBounds(20, 90, 150, 20);
  210.  barreOutil.add(JLabelnbCadeau);
  211.  //texbox du nombre de cadeau
  212.  textFieldNbCadeau.setBounds(20, 110, 30, 20);
  213.  barreOutil.add(textFieldNbCadeau);
  214.  //label "nombre de Whos"
  215.  JLabel JLabelnbWho= new JLabel("Nombre de Whos" );
  216.  JLabelnbWho.setBounds(20, 130, 150, 20);
  217.  barreOutil.add(JLabelnbWho);
  218.  //texbox du nombre de Whos
  219.  JTextField textFieldNbWho = new JTextField(20);
  220.  textFieldNbWho.setBounds(20, 150, 30, 20);
  221.  barreOutil.add(textFieldNbWho);
  222.  //label "vitesse des whos"
  223.  JLabel JLabelnbVitWho= new JLabel("Vitesse des Whos" );
  224.  JLabelnbVitWho.setBounds(20, 170, 160, 20);
  225.  barreOutil.add(JLabelnbVitWho);
  226.  //texbox de la vitesse des Whos
  227.  JTextField textFieldVitWho = new JTextField(20);
  228.  textFieldVitWho.setBounds(20, 190, 30, 20);
  229.  barreOutil.add(textFieldVitWho);
  230.  //bouton "valider"
  231.  Button btnValider = new Button("Valider" );
  232.  btnValider.setBounds(55, 225, 50, 20);
  233.  barreOutil.add(btnValider);
  234.  btnValider.addActionListener(this);
  235.  //label du score
  236.  JLabel JLabelScore = new JLabel("Score : "+score);
  237.  JLabelScore.setBounds(20, 400, 160, 20);
  238.  barreOutil.add(JLabelScore);
  239.  pane.add(barreOutil);
  240.  return pane;
  241. }
  242. public void keyPressed(KeyEvent k)
  243. {
  244.  int Caract = k.getKeyCode();
  245.  //on fait bouger l'image vers le haut
  246.  if(Caract==KeyEvent.VK_UP)
  247.   {
  248.   if(y>5)
  249.    y = y - 5;
  250.   grinch.setLocation(x, y);
  251.   }
  252.  //on fait bouger l'image vers le bas
  253.   if(Caract==KeyEvent.VK_DOWN)
  254.   {
  255.    if(y<470)
  256.     y = y + 5;
  257.    grinch.setLocation(x, y);
  258.   }
  259.   //on fait bouger l'image vers la droite
  260.   if(Caract==KeyEvent.VK_RIGHT)
  261.   {
  262.    if(x<525)
  263.     x = x + 5;
  264.    grinch.setLocation(x, y);
  265.   }
  266.   //on fait bouger l'image vers la gauche
  267.   if(Caract==KeyEvent.VK_LEFT)
  268.   {
  269.    if(x>5)
  270.     x = x - 5;
  271.    grinch.setLocation(x, y);
  272.   }
  273.  //if qui compare les coordonnées du grinch et des cado
  274.  for(int i=0; i<tableauX.size(); i++)
  275.   {
  276.   int lTabX = tableauX.get(i)+25;
  277.   int lTabY = tableauY.get(i)+25;
  278.   if(((grinch.getX()>=tableauX.get(i))&&(grinch.getX()<=lTabX))
  279.     &&((grinch.getY()>=tableauY.get(i))&&(grinch.getY()<=lTabY)))
  280.   {
  281.    JOptionPane.showMessageDialog(this,"Touché" );
  282.    score = score + 5;
  283.    //label du score
  284.    JLabelScore.setText("Score : "+score);
  285.    JLabelScore.repaint();
  286.   }
  287.   }
  288. }
  289. public void keyReleased(KeyEvent arg0) {}
  290. public void keyTyped(KeyEvent arg0) {}
  291. public void actionPerformed(ActionEvent ev)
  292. {
  293.  //si l'utilisateur clique sur le bouton "valider"
  294.  if (ev.getActionCommand().equals("Valider" ))
  295.  {
  296.   //si le nombre de cadeau est inférieur a 20
  297.   if((textFieldNbCadeau.getText().equals("" ))||(textFieldNbCadeau.getText().equals(0)||
  298.     (Integer.parseInt(textFieldNbCadeau.getText())>=20)))
  299.   {
  300.    JOptionPane.showMessageDialog(null, "Erreur dans le nombre de cadeau" );
  301.    textFieldNbCadeau.setText("" );
  302.   }
  303.   else
  304.   {
  305.    //on efface tout élément présent sur la grille
  306.    effacerGrille();
  307.    //on récupère le nombre de cadeau saisi
  308.    nbCadeau = Integer.parseInt(textFieldNbCadeau.getText());
  309.    //on génère les cadeaux sur la grille
  310.    genererCadeaux(nbCadeau);
  311.    //on repositionne le grinch en haut a gauche
  312.    grinch.setBounds(5, 5, 25, 25);
  313.    //on rafraichi la grille
  314.    pane.validate();
  315.    //on donne le focus à la grille et donc au grinch
  316.    requestFocus();
  317.   }
  318.  }
  319. }
  320. }


Message édité par tiDevDu54 le 24-11-2009 à 13:28:21
Reply

Marsh Posté le 24-11-2009 à 23:39:41    

Le problème se situe à la ligne 290 où tu redéclares localement ton JLabel JLabelScore au lieu d'utiliser celui déclaré dans la classe.

Reply

Marsh Posté le 25-11-2009 à 08:54:52    

merci beaucoup, c'était effectivement mon erreur, quel nunuche je suis ^^ !! encore merci, je reviendrai surment pour d'autre souci ^^  

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed