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 :

Rafraichissement de ce qui est affiché


Sujet :

AWT/Swing Java

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 90
    Points : 39
    Points
    39
    Par défaut Rafraichissement de ce qui est affiché
    Bonjour,

    je reviens vers vous car j'ai un autre problème, lorsque je fais une animation toute bête, un rectangle qui se déplace par exemple, et qu'il n'y a pas d'arrière plan, la "trainée" de l'image reste affichée, ce que je ne veux pas. Je ne peux pas non plus utiliser simplement clearRect car, il peut arriver quelques fois qu'il y ait un arrière plan et l'appel à clearRect effacerait cet arrière plan.

    En fait, si il n'y a pas d'arrière plan, c'est qu'il y a une vidéo derrière, mais ce n'est pas une vidéo gérée par Java.

    Pour rappel, je travaille sur awt et la JDK 1.31.

    N'hésitez pas si vous avez besoin d'autres informations.

    Merci beaucoup.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Salut,

    C'est assez vague, peux-tu nous faire parvenir le bout de code de ta fonction de dessin? Fais-tu appelle à la fonction repaint()?
    La fonction paint() ne fait que dessiner et n'efface pas le composant tu verras donc tes anciens tracés.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 90
    Points : 39
    Points
    39
    Par défaut
    Oui je fais appel à repaint, si il y a un arrière plan, il efface bien la trainée donc je pense que le dessin est bien géré, c'est seulement quand il n'y a rien qu'il ne juge pas utile de mettre à jour l'arrière plan, je pense.

    Voici un exemple d'une animation :

    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
     
    Animatable active1 = new Animatable(pictures1, true) {
    	private static final long serialVersionUID = 1L;
    	private int loop = 0;
    	public void paint(Graphics g) {
    		Picture p = this.picturesList_[0];
    p.getHeight());
    		if (this.loop == 0)
    			p.setX(p.getX() + 10);
    		else
    			p.setX(p.getX() - 10);
    		g.drawImage(p.getImage(), p.getX(), p.getY(), p.getWidth(), p.getHeight(), null);
    		super.paint(g);
    	}
     
    	public void doAnimation() {
    		try {
    			this.loop = 0;
    			for (int i = 0; i < 20; i++) {
    				this.repaint();
    				try {
    					Thread.sleep(50);
    				} catch (InterruptedException e) {
    				}
    			}
    			this.loop = 1;
    			for (int i = 0; i < 20; i++) {
    				this.repaint();
    				try {
    					Thread.sleep(50);
    				} catch (InterruptedException e) {
    				}
    			}
    		} catch (Exception e) {
    		}
    	}
    };
    J'avais pas mal expliqué ce que je faisais dans un autre post, si tu veux te renseigner un peu plus : Superposition de plusieurs Containers

    Merci.

  4. #4
    Invité
    Invité(e)
    Par défaut
    J'ai modifié un peu ton code pour en faire une classe exécutable chez moi.

    Ca marche bien donc je pense qu'il doit me manquer la partie de ton code qui consiste en la superposition de tes containers apparemment.
    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
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
     
     
    package test01;
     
    import java.awt.Frame;
    import java.awt.Graphics;
    import java.awt.Panel;
    import java.awt.Rectangle;
     
    public class Main
    {
        public static void main(String[] args)
        {
            Frame f = new Frame();
            f.setSize(200,200);
            Animatable anim = new Animatable(true);
            f.add(anim);
            f.setVisible(true);
            anim.doAnimation();
        }
    }
     
    class Animatable extends Panel
    {
     
        private static final long serialVersionUID = 1L;
        private int loop = 0;
        Rectangle r = new Rectangle(20, 20, 50, 20);
     
        Animatable(boolean b)
        {
        }
     
        public void paint(Graphics g)
        {
            if (this.loop == 0)
            {
                r.setLocation((int)r.getX() + 10,(int)r.getY());
            } else
            {
                r.setLocation((int)r.getX() - 10,(int)r.getY());
            }
     
            g.drawRect((int)r.getX(),(int)r.getY(),(int)r.getWidth(),(int)r.getHeight());
            super.paint(g);
        }
     
        public void doAnimation()
        {
            try
            {
                this.loop = 0;
                for (int i = 0; i <
                        20; i++)
                {
                    this.repaint();
                    try
                    {
                        Thread.sleep(50);
                    } catch (InterruptedException e)
                    {
                    }
                }
                this.loop = 1;
                for (int i = 0; i <
                        20; i++)
                {
                    this.repaint();
                    try
                    {
                        Thread.sleep(50);
                    } catch (InterruptedException e)
                    {
                    }
                }
            } catch (Exception e)
            {
            }
        }
    }
    Par contre si je remplace les "this.repaint()" par des "this.paint(getGraphics())" je pense que j'obtiens l'erreur dont tu parles.

    Je ne vois pas trop comment tes composants se superposent et normalement un composant ne peint que dans son "getGraphics()" pas dans celui qui est derrière.

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 90
    Points : 39
    Points
    39
    Par défaut
    Je ne comprends pas pourquoi ca ne fonctionne pas chez moi alors.

    Quand deux Containers sont l'un au dessus de l'autre, la superposition se fait correctement, il redessine bien le Container de derrière après le passage du Container de devant.
    Donc ce que je ne comprends pas, c'est si mon système d'affichage arrive à gérer la superposition, d'où vient le problème si il n'est pas bon.

    La seule différence peut être c'est que moi mes classes héritent de Container et non de Panel alors peut être que Panel gère le problème que j'ai.

    Autre différence, mes container ne sont pas ajoutés sur une Frame, je vais tester si le problème vient de là.

    En fait, mes composants ne se dessinent pas dans les Graphics des autres, c'est juste que l'affichage, comme je l'ai actuellement, ne met pas à jour les endroits où il ne devrait rien y avoir, donc ce qui a été dessiné avant n'est pas effacé, moi je comprends ca comme ca.

    Le problème n'apparait que lorsqu'un Container bouge et qu'il n'y en a aucun autre derrière.

    Merci beaucoup de ton aide.

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 90
    Points : 39
    Points
    39
    Par défaut
    En fait, je travaille sur des disques Blu-Ray qui seront lus par des platines Blu-Ray, c'est pour cela que je travaille sur une vieille version de la JDK.

    L'élément graphique qui fait office de fenetre s'appelle HScene donc je ne peux pas créer de Frame car le contexte graphique n'accepte pas plusieurs fenêtre par objets graphiques (l'erreur en Anglais est : "Cannot create more than one window per graphics device"). Donc penses tu que cela vient de ca ?

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 90
    Points : 39
    Points
    39
    Par défaut
    En fait, je pense que cela vient du composant HScene qui ne se redessine pas mais je ne sais pas encore comment le forcer à se redessiner.

    Si cela interesse quelqu'un, voila les spécifications de HScene, ca aidera peut être à mieux visualiser les choses

    HScene

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 90
    Points : 39
    Points
    39
    Par défaut
    Je viens de trouver, pour ceux que ca interesse voila la solution, c'est tout bête mais il ne faut pas l'oublier :

    Hscene scene;
    scene = HSceneFactory.getInstance().getDefautHScene()
    scene.setBackgroundMode(HScene.BACKGROUND_FILL);


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    scene = HSceneFactory.getInstance().getDefaultHScene();
    scene.setVisible(true);
    scene.setBackgroundMode(HScene.BACKGROUND_FILL);
    Merci à vous.

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

Discussions similaires

  1. datagridview Action sur ce qui est affiché
    Par dragondumond dans le forum VB.NET
    Réponses: 8
    Dernier message: 03/04/2013, 19h21
  2. ListView, limiter la taille de ce qui est affiché
    Par sam_XIII dans le forum ASP.NET
    Réponses: 3
    Dernier message: 21/01/2009, 09h58
  3. récupérer ce qui est affiché dans une combobox ?
    Par Sefrou dans le forum VBA Access
    Réponses: 2
    Dernier message: 11/01/2009, 19h37
  4. Réponses: 2
    Dernier message: 15/06/2007, 00h35
  5. Réponses: 2
    Dernier message: 25/04/2007, 15h56

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