Button qui s'efface si je passe une fenetre au dessus

Button qui s'efface si je passe une fenetre au dessus - Java - Programmation

Marsh Posté le 15-11-2006 à 23:48:09    

Bonjour,
 
J'ai écrit un démineur pour un projet universitaire. Cependant, j'ai un problem avec un de mes JPannel qui se vois "effacé" lors de l'apparition d'une autre fenetre sur mon démineur. Exemple :
 
Fenetre normale
http://pix.nofrag.com/85/8e/3db48a9833ea8eb7454862c76714t.jpg
 
Fenetre buggé
http://pix.nofrag.com/82/d2/8c70d874e2790ea6fdb4d328bccbt.jpg
 
Voici le code de la classe réalisant l'affichage :
 

Code :
  1. package pobj.game.demineur.view;
  2. import java.awt.BorderLayout;
  3. import java.awt.Dimension;
  4. import java.awt.FlowLayout;
  5. import java.awt.Graphics;
  6. import javax.swing.Box;
  7. import javax.swing.ImageIcon;
  8. import javax.swing.JButton;
  9. import javax.swing.JFrame;
  10. import javax.swing.JLabel;
  11. import javax.swing.JPanel;
  12. /**
  13. * La fenêtre globale du Démineur
  14. * @author caroline chopinaud
  15. */
  16. public class DemineurMainWindow extends JFrame {
  17. private DemineurView view;
  18. private JPanel gamePanel;
  19. public DemineurMainWindow (DemineurView view){
  20.  super("Démineur" );
  21.  this.view = view;
  22.  makeGUI();
  23.  this.pack();
  24.  this.setVisible(true);
  25. }
  26. private void makeGUI(){
  27.  gamePanel = new JPanel();
  28.  JPanel up = new JPanel();
  29.  JLabel minesRestantes = new JLabel("10" );
  30.  JLabel tempsEcoule = new JLabel("25" );
  31.  JButton newButton = new JButton();
  32.  newButton.setIcon(new ImageIcon(DemineurView.class.getResource("/pobj/game/demineur/data/Cool.png" )));
  33.  newButton.setPreferredSize(new Dimension(30,30));
  34.  newButton.setActionCommand("NEW" );
  35.  gamePanel.setLayout(new BorderLayout());
  36.  gamePanel.add(view, BorderLayout.CENTER);
  37.  gamePanel.add(up, BorderLayout.NORTH);
  38. //  Box hbox = Box.createHorizontalBox();
  39. //  hbox.add(minesRestantes);
  40. //  hbox.add(Box.createHorizontalStrut(20));
  41. //  hbox.add(newButton);
  42. //  hbox.add(Box.createHorizontalStrut(20));
  43. //  hbox.add(tempsEcoule);
  44. //  up.add(hbox);
  45.  up.setLayout(new FlowLayout());
  46.  up.add(newButton);
  47.  // TODO: créer les menus
  48.  this.setContentPane(gamePanel);
  49.  this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  50. }
  51. // TODO: créer un MenuController pour gérer les menus
  52. } // DemineurMainWindow


 
Comme vous pouvez constater, j'ai mis en commentaire la méthode avec les Box, pour m'assurer que le problème ne venait pas de là. Mais ça fait pareil avec le JPAnnel tout simple et un seul boutton.
 
Je pensais que les objets de type JPannel faisaient appel automatiquement à la méthode repaint() lorsqu'un événement système se produisait. D'ailleurs, mon panel CENTER qui contient la grille fonctionne parfaitement si je passe une autre fenetre dessus, il ne s'efface pas. Voici le code de celui-ci au cas ou :
 

Code :
  1. package pobj.game.demineur.view;
  2. import java.awt.Dimension;
  3. import java.awt.GridLayout;
  4. import java.util.ArrayList;
  5. import javax.swing.JPanel;
  6. import pobj.game.demineur.model.DemineurModel;
  7. import pobj.game.demineur.model.ModelChangeEvent;
  8. import pobj.game.demineur.model.ModelChangeListener;
  9. /**
  10. * La vue du Démineur
  11. * @author caroline chopinaud
  12. */
  13. public class DemineurView extends JPanel implements ModelChangeListener  {
  14. /** La hauteur d'une case */
  15. public final static int HAUTEUR_CASE = 30;
  16. /** La largeur d'une case */
  17. public final static int LARGEUR_CASE = 30;
  18. /** Le modèle du démineur */
  19. private DemineurModel model;
  20. /** Le tableau des vues des Cases */
  21. private CaseView tableauCase[][];
  22. /** La liste des écouteurs de notification de changement au niveau de la vue */
  23. private ArrayList<ViewChangeListener> changeListeners;
  24. /**
  25.  * Création d'une vue du Démienur
  26.  * @param model le modèlé du Démineur
  27.  */
  28. public DemineurView(DemineurModel model) {
  29.         this.model = model;
  30.        
  31.         // TODO: ajouter la vue "this" comme écouteur du modèle pour les ModelChangeEvent
  32.         model.addModelChangeListener(this);
  33.        
  34.         // TODO: construire la liste des écouteur de changement de vue
  35.         changeListeners = new ArrayList<ViewChangeListener>();
  36.        
  37.         // création de la vue
  38.         makeGUI();
  39.     }
  40. /**
  41.  * Initialisation graphique de la vue du Démineur. Tout en vrac mais on pourra séparer comme dans le cours.  
  42.  */
  43. private void makeGUI() {
  44.  setLayout(new GridLayout(model.getnbCol(), model.getnbRow()));
  45.  setPreferredSize (new Dimension(model.getnbCol()*LARGEUR_CASE, model.getnbRow()*HAUTEUR_CASE));
  46.  tableauCase = new CaseView[model.getnbCol()][model.getnbRow()];
  47.  CaseView maCase;
  48.  for (int i = 0; i < model.getnbCol(); i++) {
  49.   for (int j = 0; j < model.getnbRow(); j++) {
  50.    maCase = new CaseView(i, j, this, model.getCase(i, j));
  51.    add(maCase);
  52.    tableauCase[i][j] = maCase;
  53.   }
  54.  }
  55. }
  56. /**
  57.  * Accesseur au modèle du jeu
  58.  * @return le modèle du jeu
  59.  */
  60. public DemineurModel getModel(){
  61.  return model;
  62. }
  63. /**
  64.  * Enregistre un écouteur de la vue
  65.  * @param l l'écouteur du modèle à ajouter
  66.  */
  67.     public void addViewChangeListener(ViewChangeListener l) {
  68.         changeListeners.add(l);
  69.     }
  70.     /**
  71.      * Désenregistre un écouteur de la vue
  72.      * @param l l'écouteur du modèle à supprimer
  73.      */
  74.     public void removeViewChangeListener(ViewChangeListener l) {
  75.         changeListeners.remove(l);
  76.     }
  77.     /**
  78.      * Notifie les écouteurs d'un changement dans la vue
  79.      * @param event l'événement à envoyer
  80.      */
  81.     public void fireModelChange(ViewChangeEvent event) {
  82.      for(ViewChangeListener l : changeListeners){
  83.             l.viewChanged(event);
  84.      }
  85.     }
  86.    
  87. /**
  88.  * Lors d'un changement dans le modèle. Ici on affiche si la partie a été gagnée ou perdue. Il faudrait
  89.  * le faire via le smiley.
  90.  * Réafiche à la case ayant généré cet événement. Réaffiche tout le jeu si la partie est perdue.
  91.  */
  92. public void modelChanged(ModelChangeEvent evt){
  93.  //System.out.println("je suis dans modelChanged" );
  94.  if (evt.getStatut() == evt.GAGNE) {
  95.   System.out.println("bravo, vous avez gagné!" );
  96.  }
  97.  else if (evt.getStatut() == evt.PERDU) {
  98.   System.out.println("vous avez perdu!" );
  99.   for (int i = 0; i < tableauCase.length; i++) {
  100.    for (int j = 0; j < tableauCase[0].length; j++) {
  101.     tableauCase[i][j].drawCase();
  102.    }
  103.   }
  104.  }
  105.  else {
  106.   tableauCase[evt.getCol()][evt.getRow()].drawCase();
  107.  }
  108. }
  109. }// DemineurVue


 
J'espère avoir été assez clair :)


Message édité par _kal_ le 16-11-2006 à 09:36:16
Reply

Marsh Posté le 15-11-2006 à 23:48:09   

Reply

Marsh Posté le 16-11-2006 à 10:17:04    

up du matin :)

Reply

Marsh Posté le 16-11-2006 à 12:27:42    

Je ne comprend vraiment pas d'ou vien le problème. J'ai créée un petit programme qui dessine le même type de fenetre et je n'ai pas de problème !
 
Voici le code :
 
MaFenetre.java :

Code :
  1. package pobj.game.demineur;
  2. import java.awt.BorderLayout;
  3. import java.awt.Dimension;
  4. import java.awt.GridLayout;
  5. import javax.swing.Box;
  6. import javax.swing.ImageIcon;
  7. import javax.swing.JButton;
  8. import javax.swing.JFrame;
  9. import javax.swing.JLabel;
  10. import javax.swing.JPanel;
  11. import pobj.game.demineur.view.DemineurView;
  12. public class MaFenetre extends JFrame {
  13. JPanel up;
  14. JPanel view;
  15. JPanel gamePanel;
  16. public MaFenetre(String s) {
  17.  up = new JPanel();
  18.  view = new JPanel();
  19.  gamePanel = new JPanel();
  20.  this.setTitle(s);
  21.  this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  22.  JLabel minesRestantes = new JLabel("10" );
  23.  JLabel tempsEcoule = new JLabel("25" );
  24.  JButton newButton = new JButton();
  25.  newButton.setIcon(new ImageIcon(DemineurView.class.getResource("/pobj/game/demineur/data/Cool.png" )));
  26.  newButton.setPreferredSize(new Dimension(30,30));
  27.  newButton.setActionCommand("NEW" );
  28.  Box hbox = Box.createHorizontalBox();
  29.  hbox.add(minesRestantes);
  30.  hbox.add(Box.createHorizontalStrut(20));
  31.  hbox.add(newButton);
  32.  hbox.add(Box.createHorizontalStrut(20));
  33.  hbox.add(tempsEcoule);
  34.  hbox.validate();
  35.  up.add(hbox);
  36.  view.setLayout(new GridLayout(10, 10));
  37.  view.setPreferredSize(new Dimension(300, 300));
  38.  for (int i = 0 ; i < 100 ; i++) {
  39.   JButton btn = new JButton();
  40.   btn.setIcon(new ImageIcon(DemineurView.class.getResource("/pobj/game/demineur/data/Cool.png" )));
  41.   btn.setPreferredSize(new Dimension(30,30));
  42.   btn.setActionCommand("NEW" );
  43.   view.add(btn);
  44.  }
  45.  gamePanel.setLayout(new BorderLayout());
  46.  gamePanel.add(up, BorderLayout.NORTH);
  47.  gamePanel.add(view, BorderLayout.CENTER);
  48.  this.getContentPane().add(gamePanel);
  49. }
  50. }


 
MaFenetreMain.java :

Code :
  1. package pobj.game.demineur;
  2. public class MaFenetreMain {
  3. public static void main(String[] args) {
  4.  MaFenetre fen = new MaFenetre("test" );
  5.  fen.pack();
  6.  fen.setVisible(true);
  7. }
  8. }


 
La fenetre là ne s'efface jamais ! Par conséquent, le problème pourrait venir du JPannel CENTER qui est de type DemineurView... Mais je vois pas le problème.


Message édité par _kal_ le 16-11-2006 à 12:29:11
Reply

Sujets relatifs:

Leave a Replay

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