repaint() n'apelle jamais paint() ou paintComponent()
Bonjour,
J'ai un problème de rafraîchissement du graphisme d'un panneau (PanelAffichage).
J'ai surchargé la méthode paintComponent(g). Au lancement de l'appli, tout se dessine comme prévu. Mais lorsque j'ai besoin de faire rafraîchir le graphisme de ce PanelAffichage, j'utilise la méthode repaint() depuis une instance du PanelAffichage mais jamais la méthode paintComponent(g) n'est appelée.
Pour vérifier, j'ai placé un system.out.println() dans la méthode paintComponent(g).
J'ai essayé avec la méthode paint() mais c'est pareil.
voici ma classe Controleur depuis laquelle je fait le repaint() à la ligne 90 :
Code:
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 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196
| package com.francky.lettres.ctrl;
import java.awt.Color;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.Vector;
import com.francky.lettres.modele.CouleurThemes;
import com.francky.lettres.modele.Mot;
import com.francky.lettres.modele.MotDAO;
import com.francky.lettres.vues.FenetrePrincipale;
import com.francky.lettres.vues.panneaux.PanelAffichage;
public class Controleur {
//***********************************************************DECLARATIONS
FenetrePrincipale fenetreprincipale;
PanelAffichage panelaffichage;
MotDAO motdao = new MotDAO("mots.xml");
Vector<Mot> mots = null; //contenant de tous les objets Mot
public boolean debug; //variable pour le débuggage
private int randomNum; //variable contenant le numéro trouvé par le random
/*
* Gestion du score et des statistiques
*/
private int score;
private int motsTrouves;
private int nbreLettres;
private int niveau;
/*
* Message d'information
*/
public String message;
/*
* Gestion du mot à rechercher et à cacher
*/
private String mot; //le mot qui a été choisi au hasard
private StringBuilder motCache; //le mot transformé pour affichage
private ArrayList<Character> listeLettres; //le tableau contenant toute les lettres du mot choisi au hasard
private List<Character> listeLettresTrouvees; //Liste des lettres qui ont été trouvées
private Character lettreTrouvee; //dernière lettre trouvée
/*
* Définition de la palette des couleurs pour le jeu
*/
private String COLOR_THEME = "theme3"; //theme1 à theme5
public Color COL_FOND;
public Color COL_TEXTE_1;
public Color COL_TEXTE_2;
public Color COL_MOT;
public Color COL_GRAPH;
//***********************************************************CONSTRUCTEUR
public Controleur() {
//************************************Initialisations
resetGame();
resetColors();
choixNouveauMot();
//************************************création de la fenêtre
fenetreprincipale = new FenetrePrincipale(this);
fenetreprincipale.setVisible(true);
}
private char[] motToLettersTab(String mot2) {
char[] resultTab = mot.toCharArray();
return resultTab;
}
//***********************************************************METHODES
//recherche d'une lettre cliquée dans le mot
public void searchLetter(Character lettreClic) {
for(Character lettre : mot.toCharArray()) {
if(lettre.equals(lettreClic)){
if(debug)System.out.println("lettre trouvée !"); //debug
message = "lettre trouvée !";
listeLettresTrouvees.add(lettreClic);
lettreTrouvee = lettreClic;
//générer et ré afficher le mot caché
listeLettres = setlisteLettres(listeLettres);
panelaffichage.repaint();
break;
} else {
if(debug)System.out.println("Lettre non trouvée !"); //debug
message = "lettre non trouvée !";
}
}
}
//Choix d'un nouveau mot parmi la liste, on retire le mot choisi de la liste,
//on génère le tableau de lettres du mot choisi, on génère le mot caché
private void choixNouveauMot() {
randomNum = randomNum();
//affichage dans console pour debug
if (debug){
for(Mot m : mots){
System.out.println("mot : " + m.getChaine() + ", genre : " + m.isGenre() + ", composed : " + m.isComposed());
}
System.out.println("randomNum = " + randomNum);
System.out.println("le mot est : " + mots.get(randomNum).getChaine());
}
mot = mots.get(randomNum).getChaine();
//on enleve de la liste le mot qui a été tiré au hazard pour qu'il ne soit pas choisi au hasard plusieurs fois
mots.remove(randomNum);
//affichage dans console pour debug
if (debug){
for(Mot m : mots){
System.out.println("mot : " + m.getChaine() + ", genre : " + m.isGenre() + ", composed : " + m.isComposed());
}
}
//lorsque le nouveau mot a été choisi, il faut remplir un tableau de Character avec des underscores
for(int rank = 0; rank < mot.length(); rank++){
listeLettres.add('_');
}
}
//réinitialisation des couleurs
private void resetColors() {
//initialisation des couleurs - a l'avenir il faudra aller chercher le theme dans un .xml
CouleurThemes coul = new CouleurThemes(COLOR_THEME);
COL_FOND = coul.getColComplementaire_5();
COL_TEXTE_1 = coul.getColPrimaire_3();
COL_TEXTE_2 = coul.getColPrimaire_2();
COL_MOT = coul.getColPrimaire_3();
COL_GRAPH = coul.getColPrimaire_1();
}
//remise à zéro des paramètres d'initialisation
private void resetGame() {
debug = true;
setScore(0);
setMotsTrouves(0);
setNbreLettres(0);
setNiveau(1);
listeLettres = new ArrayList<Character>();
lettreTrouvee = ' ';
motCache = new StringBuilder();
listeLettresTrouvees = new ArrayList<Character>();
panelaffichage = new PanelAffichage(this);
mots = motdao.chargerMots();
}
//génération d'un entier au hasard compris entre 0 et les nombre de mots contenus dans la liste des mots en .xml
private int randomNum(){
Random rand = new Random();
return rand.nextInt((mots.size()));
}
//création du mot qui sera affiché (on montre les lettres qui ont déjà été trouvées) prend en paramètre la liste
private ArrayList<Character> setlisteLettres(ArrayList<Character> listeLettres){
for (int rank = 0; rank < listeLettres.size(); rank++){
if(listeLettres.get(rank).equals('_')){
if(lettreTrouvee.equals(mot.charAt(rank))){
listeLettres.set(rank, lettreTrouvee);
}
}
}
return listeLettres;
}
//***********************************************************GETTERS & SETTERS
public int getScore() {return score;}
public void setScore(int score) {this.score = score;}
public int getMotsTrouves() {return motsTrouves;}
public void setMotsTrouves(int motsTrouves) {this.motsTrouves = motsTrouves;}
public int getNbreLettres() {return nbreLettres;}
public void setNbreLettres(int nbreLettres) {this.nbreLettres = nbreLettres;}
public int getNiveau() {return niveau;}
public void setNiveau(int niveau) {this.niveau = niveau;}
public String getMot() {return mot;}
public void setMot(String mot) {this.mot = mot;}
public List<Character> getListeLettres() {return listeLettres;}
} |
voici le panneau PanelAffichage avec la méthode paintComponent à la ligne 55 :
Code:
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 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
| package com.francky.lettres.vues.panneaux;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;
import javax.swing.JPanel;
import com.francky.lettres.ctrl.Controleur;
public class PanelAffichage extends JPanel {
/**
*
*/
private static final long serialVersionUID = 8624942466374820397L;
//***********************************************************DECLARATIONS
private Controleur ctrl;
int x = 0;
/*
* Taille du panneau affichage
*/
private static final int PANEL_WIDTH = PanelKeyboard.KEYBOARD_WIDTH + PanelScore.SCORE_WIDTH;
private static final int PANEL_HEIGHT = 150;
/*
* Taille et position de la zone d'affichage du texte
*/
private static final int TEXT_ZONE_WIDTH = PanelKeyboard.KEYBOARD_WIDTH + PanelScore.SCORE_WIDTH - 20;
private static final int TEXT_ZONE_HEIGHT = 100;
private static final int TEXT_ZONE_X = 10;
private static final int TEXT_ZONE_Y = 25;
/*
* Taille et position du mot à chercher
*/
private static final int MOT_TAILLE = 50;
private static final Font MOT_FONT = new Font("Tahoma", Font.BOLD, MOT_TAILLE);
private static final int MOT_Y = TEXT_ZONE_HEIGHT / 2 + TEXT_ZONE_Y + 20;
private static final int MOT_X = TEXT_ZONE_X + 15;
//***********************************************************CONSTRUCTEUR
public PanelAffichage(Controleur ctrl) {
this.ctrl = ctrl;
setPreferredSize(new Dimension(PANEL_WIDTH, PANEL_HEIGHT));
setBackground(ctrl.COL_FOND);
}
//***********************************************************GETTERS & SETTERS
//***********************************************************METHODES
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(ctrl.COL_GRAPH);
g.drawRect(TEXT_ZONE_X, TEXT_ZONE_Y, TEXT_ZONE_WIDTH, TEXT_ZONE_HEIGHT);
//affichage du mot caché
g.setColor(ctrl.COL_MOT);
g.setFont(MOT_FONT);
int decal = 0;
for(int caractere = 0; caractere < ctrl.getListeLettres().size(); caractere++){
g.drawString("" + ctrl.getListeLettres().get(caractere), MOT_X + decal, MOT_Y);
System.out.println("paint is called");
decal += 45;
}
}
} |
et voici ma classe FenetrePrincipale à partir de laquelle je créé mon PanelAffichage :
Code:
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 45 46 47 48 49 50
| package com.francky.lettres.vues;
import java.awt.BorderLayout;
import javax.swing.JFrame;
import com.francky.lettres.ctrl.Controleur;
import com.francky.lettres.vues.panneaux.PanelAffichage;
import com.francky.lettres.vues.panneaux.PanelKeyboard;
import com.francky.lettres.vues.panneaux.PanelScore;
public class FenetrePrincipale extends JFrame {
/**
*
*/
private static final long serialVersionUID = -221472257022120727L;
//********************************************************DECLARATIONS
private Controleur ctrl;
public FenetrePrincipale(Controleur ctrl) {
//construction de la fenêtre
super("Lettres");
setLayout(new BorderLayout());
setDefaultCloseOperation(EXIT_ON_CLOSE);
setResizable(false);
this.ctrl = ctrl;
/*
* Initialisation des panneaux
*/
//création du clavier
PanelKeyboard panelkeyboard = new PanelKeyboard(ctrl);
//ajout du clavier à la fenêtre
add(panelkeyboard, BorderLayout.CENTER);
//Création du panneau de score
PanelScore panelscore = new PanelScore(ctrl);
add(panelscore, BorderLayout.EAST);
//création du panneau d'affichage des mots
PanelAffichage panelaffichage = new PanelAffichage(ctrl);
add(panelaffichage, BorderLayout.NORTH);
pack();
setLocationRelativeTo(null);
}
} |
Si quelqu'un veut bien m'aider, je vous en remercie bien par avance !
:?