IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

AWT/Swing Java Discussion :

JPanel et repaint()


Sujet :

AWT/Swing Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 9
    Par défaut JPanel et repaint()
    Bonjour,

    J'ai un JPanel comprenant des dessins représentant des objets (noeuds, liens). Ces objets étant modifiés par un algorithme, leur représentation graphique est elle-même modifiée (paramètres tels que la couleur ou la taille dépendants des attributs de ces objets).
    Une mise à jour du dessin est effectuée automatiquement dès qu'un changement a lieu sur les attributs des objets. Or, je ne veux pas que le dessin soit modifié en permanence. Je veux qu'il soit modifié à un moment précis de l'algorithme.
    Comment faire?

    merci d'avance.

  2. #2
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 904
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 904
    Billets dans le blog
    54
    Par défaut
    Sans details de l'implementation c'est difficile de pouvoir t'aider.

    Si ton calcul se deroule durant l'EDT (event dispatch thread) alors tu ne risques rien car le reaffichage/raffraichissement ne se deroulera qu'apres l'execution de ton calcul.

    Si ton calcul se deroule dans une thread separee, a priori, tu peux mettre un flag qui indique que tu est pret a rendre le resultat du calcul.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 9
    Par défaut
    Merci

    Tu m'as vraiment mise sur la bonne piste. En effet le calcul se déroule sur l'EDT et donc j'ai pu arranger mon code pour que le rafraîchissement se fasse au bon moment.

  4. #4
    Membre Expert
    Avatar de afrikha
    Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    1 600
    Détails du profil
    Informations personnelles :
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2005
    Messages : 1 600
    Par défaut
    N'oublie pas de mettre présent en bas de page


    Mes publications
    Lisez
    Les régles du forum
    Pensez au bouton

  5. #5
    Membre Expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Par défaut
    Je te conseille aussi quand tu dois modifier la représentation de ne modifier qu'une BufferedImage que tu aurais en attribut.

    Un exemple d'un petit logiciel de rendu 3D que j'avais à développer pour les cours, je pense que le principe devrait t'aider (j'ai mis en gras ce qui est important)
    Cette classe met à jour l'affichage du rendu en temps réel à partir du modèle, et ne change vraiment que l'image que lorsque l'image du modèle a changé, et non à chaque fois que swing demande un repaint()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    package n7.gh4.synthese.view;
    
    import java.awt.Dimension;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.image.BufferedImage;
    
    import javax.swing.JPanel;
    
    import n7.gh4.synthese.model.EcranEvent;
    import n7.gh4.synthese.model.EcranListener;
    import n7.gh4.synthese.model.RenduScene;
    
    /**
     * Cette classe représente l'écran de rendu, qui contient l'affichage du rendu
     * de la scène.
     * 
     * @author rom1v
     */
    public class EcranRendu extends JPanel implements EcranListener {
    
        private BufferedImage buf;
        private int w; // Nombre de pixels horizontaux
        private int h; // Nombre de pixels verticaux
    
        /**
         * Crée un écran de rendu.
         * 
         * @param rendu
         *            Rendu à représenter.
         */
        public EcranRendu(RenduScene rendu) {
            super();
            init(rendu);
        }
    
        /**
         * Affecte un rendu de scène à un écran.
         * 
         * @param rendu
         *            Rendu de scène.
         */
        public void init(RenduScene rendu) {
            w = rendu.getEcran().getResolutionH();
            h = rendu.getEcran().getResolutionV();
            setMinimumSize(new Dimension(w,h));
            setPreferredSize(new Dimension(w, h));
    
            buf = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
        }
    
        public void paintComponent(Graphics graphics) {
            Graphics2D g2D = (Graphics2D) graphics;
            g2D.drawImage(buf, null, 0, 0);
        }
    
        public void ecranModifie(EcranEvent e) {
            Graphics2D g = (Graphics2D) buf.getGraphics();
            int x = e.getX();
            int y = e.getY();
            int sizeX = e.getTailleBlocH();
            int sizeY = e.getTailleBlocV();
            g.setColor(e.getCouleur().toColor());
            g.fillRect(x, y, sizeX, sizeY);
        }
    
    }

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 9
    Par défaut
    on a réussi avec Swing mais merci du conseil... ca me servira certainement un jour

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [JPanel] paint, paintComponent et repaint ?
    Par Pill_S dans le forum Composants
    Réponses: 8
    Dernier message: 08/02/2013, 17h38
  2. Réponses: 7
    Dernier message: 08/02/2010, 10h51
  3. pb repaint() sur JPanel
    Par david06600 dans le forum AWT/Swing
    Réponses: 3
    Dernier message: 06/06/2007, 16h39
  4. fonctionnement de " JPanel.repaint() "
    Par Ndugu dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 29/04/2007, 00h23
  5. Problème repaint JPanel
    Par anthony62 dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 19/09/2006, 15h09

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