Discussion: Repaint d'un JPanel

  1. #1
    Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    novembre 2013
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : novembre 2013
    Messages : 49
    Points : 45
    Points
    45

    Par défaut Repaint d'un JPanel

    Hey !

    J'essaye depuis peu de faire un petit jeu avec interface graphique (Light Out), tout fonctionne à merveille, j'ai donc décidé d'y ajouter un solveur que l'on peut déclencher en cliquant sur la touche espace du clavier et c'est là où se pose mon problème...
    Mon interface est composé d'une grille de JPanel (Un objet en héritant nommé "Case"), le solveur a pour effet de changer la texture de la case sur laquelle il faut cliquer (une fois cliqué, on passe à la suivante ainsi de suite) mais il s'avère que j'ai un "bug" d'actualisation qui semble être aléatoire... En effet, il arrive à peu près une fois sur deux que la texture ne s'applique bien, bien que le paintComponent semble bien exécuté.
    Voici donc mon code :
    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    protected void paintComponent(Graphics g) {
    		super.paintComponent(g);
    		try {
    			BufferedImage imageB = ImageIO.read(new File(imagePath));
    			g.drawImage(imageB, 0, 0, getSize().width, getSize().height, null);
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    		setBorder(border);
    	}
    La variable "imagePath" est une variable globale contenant le lien vers l'image à afficher.
    Voici la fonction s'occupant de définir la texture de la case pour le solveur :
    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public void highlight(boolean bool) {
    		if(bool) {
    			imageTemp = imagePath;
    			imagePath = "img/solve.png";
    		} else {
    			imagePath = imageTemp;			
    		}
    		repaint();
    	}
    Cette méthode est ensuite appelé par l'algorithme gérant le solveur :
    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public static void nextClue() {
    		if (i < toType.size()) {
    			LightOut.grid[toType.get(i).getX()][toType.get(i).getY()].highlight(true);
    			i++;
    		}
    	}
    Cette fonction, a chaque fois qu'elle est appelé, dit à la case de changer sa texture, cette méthode est ensuite appelé à chaque fois que le joueur clic sur la case activé précédemment par le solveur.

    Voici pour mon code, le problème étant donc qu'il arrive parfois que bien que le paintComponent s'active, la texture de la case ne s'actualise pas...

    Sauriez-vous comment résoudre ce problème ?

    Merci par avance !

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java/Eclipse RCP
    Inscrit en
    septembre 2009
    Messages
    10 425
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java/Eclipse RCP
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : septembre 2009
    Messages : 10 425
    Points : 24 857
    Points
    24 857
    Billets dans le blog
    2

    Par défaut

    Salut,

    Tu ne dois pas avoir d'appel du type setBorder(border); dans ta méthode paintComponent(). La méthode paintComponent() est une méthode bas niveau chargée de mettre à jour ce qui est affiché dans le composant, par l'intermédiaire du contexte graphique (l'instance de Graphics). setBorder est une méthode haut niveau qui change un état dans le composant (la bordure) et donc nécessite de redessiner éventuellement le composant, donc de repasser par paintComponent à un moment donné (non contrôlable, c'est Swing qui va décider quand, mais au plus tôt possible, et en repassant éventuellement par le redessin d'autres composants). Il est fort possible que cette "boucle" provoque des dysfonctionnements dans le redessin de ton interface, en particulier à cause de la gestion du contexte graphique. Maintenant, pour être sûr, il faudrait voir plus de code. Avec les rares et maigres bribes que tu montres, c'est difficile de faire autre chose que de la spéculation.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

Discussions similaires

  1. [JPanel] paint, paintComponent et repaint ?
    Par Pill_S dans le forum Composants
    Réponses: 8
    Dernier message: 08/02/2013, 18h38
  2. Réponses: 7
    Dernier message: 08/02/2010, 11h51
  3. fonctionnement de " JPanel.repaint() "
    Par Ndugu dans le forum AWT/SWING
    Réponses: 4
    Dernier message: 29/04/2007, 01h23
  4. Problème repaint JPanel
    Par anthony62 dans le forum AWT/SWING
    Réponses: 4
    Dernier message: 19/09/2006, 16h09
  5. JPanel et repaint()
    Par manouchka dans le forum AWT/SWING
    Réponses: 8
    Dernier message: 14/07/2006, 11h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo