Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1070 connectés 

  FORUM HardWare.fr
  Programmation
  Java

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°1476112
_kal_
Posté le 15-11-2006 à 23:48:09  profilanswer
 

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
mood
Publicité
Posté le 15-11-2006 à 23:48:09  profilanswer
 

n°1476210
_kal_
Posté le 16-11-2006 à 10:17:04  profilanswer
 

up du matin :)

n°1476276
_kal_
Posté le 16-11-2006 à 12:27:42  profilanswer
 

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

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Java

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

 

Sujets relatifs
fenêtre tkMessageBoxcréer un compte sur un site (mot de passe et pseudo) ???
afficher des caracteres accentués dans une fenetre MS-DOS[Flash] fscommand : Comment puis-je masquer une fenêtre MS-DOS?
Probleme objet passé en session - php5Agrandissement fenetre
Ouverture de fenetre sous windows[c++] envoie d'un mail avec login et mot de passe
Problème de fenêtre d'erreur lors de la compilationchoix du button radio à mettre dans un caddie
Plus de sujets relatifs à : Button qui s'efface si je passe une fenetre au dessus


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR