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 :

Conserver le dessin de plusieurs objet malgrè repaint()


Sujet :

AWT/Swing Java

  1. #1
    Membre confirmé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Points : 616
    Points
    616
    Par défaut Conserver le dessin de plusieurs objet malgrè repaint()
    Bonjour,
    Je souhaite dessiner plusieurs objets(de différentes classes) successivement mais quand je repaint() les objets précédemment dessinés ne le sont plus (bien que je n'utilise pas de clearRect(...)).

    Je vous explique en gros :

    J'ai 2 classes A1 et A2 qui héritent de A.
    J'ai une classe Dessin.java.

    A1 et A2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    import ...
     
    class Ax
    {
      ...
     
      public void dessiner(int x, int y, Graphics g)
      {
        g.fillRect(...);
      }
    }
    Dessin.java
    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
     
    import ...
     
    class Dessin
    {
      LinkedList l;
      int x, y;
     
       Dessin(LinkedList l)
      {
        this.l = l;
      }
      ...
     
      public void actionPerformed(ActionEvent evt) 
     
      {
        repaint();
       }
     
      public void paint(Graphics g) 
      {
        l.get(i).dessiner(x,y,g);
       }
    }
    Main.java
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    class Main
    {
      public static void main(String[] args)
     {
         LinkedList<A> l = new LinkedList<A>(); // admettons que cette liste soit pleine d'objets A1 et A2
         ...
         new Dessin(l);
     
      }	
    }
    Les objets sont dessinés, mais à chaque dessin d'un objets les précédents ne sont plus affichés et disparaissent alors que je souhaiterais qu'il apparaissent tous(mais un après l'autre).

    Merci de votre attention.

  2. #2
    Membre averti Avatar de Amine_sas
    Profil pro
    Étudiant
    Inscrit en
    Juin 2005
    Messages
    245
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2005
    Messages : 245
    Points : 307
    Points
    307
    Par défaut
    Salut,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public void paint(Graphics g)
     {
         l.get(i).dessiner(x,y,g);
     }
    là, je pense qu'il faut mettre une boucle pour dessiner tous les objets que contient ta liste:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     for (A a : l) /* une boucle for each == pour chaque a de type A et qui appartienne à l */
    a.dessiner(x,y,z);
    "Un remboursement des programmes défectueux serait envisageable mais toute l'industrie du logiciel ferait faillite la première année." Andrew Tanenbaum.

  3. #3
    Membre confirmé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Points : 616
    Points
    616
    Par défaut
    J'ai appelé la méthode dessiner() pour simplifier mais en fait ça dépend des objets de la liste.
    Disons que les A1 redéfinissent la méthode dessiner() pour dessiner, et les A2 pour changer la couleur des A1(sachant que j'ai un mécanisme pour faire correspondre les A1 et A2).
    Le problème de la boucle est que je vais bien redéssiner mes objets A1 mais l'action liée aux objets A2 je veux l'executer qu'une seul fois.
    Donc la boucle réexecutera l'action associée à A2 à chaque fois et c'est ce que je ne veux pas.
    Tu comprend à peu près ce que je veux dire?

  4. #4
    Membre averti Avatar de Amine_sas
    Profil pro
    Étudiant
    Inscrit en
    Juin 2005
    Messages
    245
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2005
    Messages : 245
    Points : 307
    Points
    307
    Par défaut
    Citation Envoyé par juve1897 Voir le message
    J'ai appelé la méthode dessiner() pour simplifier mais en fait ça dépend des objets de la liste.
    Disons que les A1 redéfinissent la méthode dessiner() pour dessiner, et les A2 pour changer la couleur des A1(sachant que j'ai un mécanisme pour faire correspondre les A1 et A2).
    Le problème de la boucle est que je vais bien redéssiner mes objets A1 mais l'action liée aux objets A2 je veux l'executer qu'une seul fois.
    Donc la boucle réexecutera l'action associée à A2 à chaque fois et c'est ce que je ne veux pas.
    Tu comprend à peu près ce que je veux dire?
    Si la méthode dessiner() des objets A2 n'est à appeler qu'une seule fois (donc seulement pour le premier objet rencontré dans la liste) alors pourquoi insérer tant d'objets (A2) dans la liste ?
    Et si tu as vraiment besoin de les insérer tous, tu peux mettre une condition pour n'appeler la méthode que sur le premier objet:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     boolean b = false;
    for (A a : l) 
    {  
         if (a instanceof A2) 
        {
           if (!b )
          {
            a.dessiner();
            b = true;
          } 
        }
      else
      a.dessiner(x,y,z);
    }
    "Un remboursement des programmes défectueux serait envisageable mais toute l'industrie du logiciel ferait faillite la première année." Andrew Tanenbaum.

  5. #5
    Membre confirmé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Points : 616
    Points
    616
    Par défaut
    Il n'y en pas qu'un seul, les A1 et A2 sont mélanges dans la liste.
    En fait je voudrais "jouer" les actions de la liste dans l'ordre avec un laps de temps entre deux éléments de la liste. Ce qui n' est pas possible avec une boucle à moins que l'on puisse faire une pause dans la boucle avant chaque itération.
    Ce qui ne me convient pas trop car je souhaiterais ensuite avec le cotrôle de faire pause puis de reprendre, ...

  6. #6
    Membre averti Avatar de Amine_sas
    Profil pro
    Étudiant
    Inscrit en
    Juin 2005
    Messages
    245
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2005
    Messages : 245
    Points : 307
    Points
    307
    Par défaut
    Citation Envoyé par juve1897 Voir le message
    Il n'y en pas qu'un seul, les A1 et A2 sont mélanges dans la liste.
    En fait je voudrais "jouer" les actions de la liste dans l'ordre avec un laps de temps entre deux éléments de la liste. Ce qui n' est pas possible avec une boucle à moins que l'on puisse faire une pause dans la boucle avant chaque itération.
    Ce qui ne me convient pas trop car je souhaiterais ensuite avec le cotrôle de faire pause puis de reprendre, ...
    Alors pourquoi ne pas utiliser un thread.
    "Un remboursement des programmes défectueux serait envisageable mais toute l'industrie du logiciel ferait faillite la première année." Andrew Tanenbaum.

  7. #7
    Membre confirmé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Points : 616
    Points
    616
    Par défaut
    Parce que je ne maîtrise pas les thread. J'ai un peu essayer, mais j'ai laissé tomber. Et au point où j'en suis je ne peux faire machine arrière.
    Ce n'est pas possible autrement.

  8. #8
    Membre averti Avatar de Amine_sas
    Profil pro
    Étudiant
    Inscrit en
    Juin 2005
    Messages
    245
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2005
    Messages : 245
    Points : 307
    Points
    307
    Par défaut
    Pour faire très simple avec les threads:

    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
     class Dessin implements Runnable
    {
      LinkedList l;
      int x, y;
      Thread th;
     
     Dessin(LinkedList l)
      {
        this.l = l;
        th = new Thread(this);
        th.start();
      }
      ...
    public void run() // ce code sera exécuté par le thread
    {
     
     boolean b = false;
    for (A a : l) 
    {  
         if (a instanceof A2) 
        {
           if (!b )
          {
            a.dessiner();
            b = true;
          } 
        }
      else
      a.dessiner(x,y,z);
    try
    {
      sleep(1000); //  pause d'une seconde
    }
    catch(InterruptedException e){... }
     
    }
    }
    Le code du thread est exécuté une seul fois; si tu veux que le thread s'exécute jusqu'à ce que tu l'arrêtes explicitement, ajoutes une boucle du type:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     public void run()
    { 
       while( !interrupted) // variable booléenne
      {
        // le code de run ci-dessus
     
       }
     
    }
    Une fois interrupted est mise à true, le thread se termine.
    "Un remboursement des programmes défectueux serait envisageable mais toute l'industrie du logiciel ferait faillite la première année." Andrew Tanenbaum.

  9. #9
    Membre confirmé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Points : 616
    Points
    616
    Par défaut
    Mais j'ai l'impression que l'on a rien gagner vu que d'après ce que je comprend le processus est attaché à l'ensemble de la liste. Il n'y a pas un processus pour chaque élément.
    De toute façon un processus par élément serait dur à gérer(synchronisation,...).
    J'ai du mal avec les processus en Java car j'ai plutôt l'habitude du C.
    donc je pense que je vais faire sans.

  10. #10
    Membre averti Avatar de Amine_sas
    Profil pro
    Étudiant
    Inscrit en
    Juin 2005
    Messages
    245
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2005
    Messages : 245
    Points : 307
    Points
    307
    Par défaut
    Tu n'as besoin qu'à un seul thread sauf si j'ai pas très bien compris ton problème.
    "Un remboursement des programmes défectueux serait envisageable mais toute l'industrie du logiciel ferait faillite la première année." Andrew Tanenbaum.

  11. #11
    Membre confirmé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Points : 616
    Points
    616
    Par défaut
    Je vais essayer de mieux expliquer le problème.
    En fait j'ai une une liste d'objet composée d'objets différents héritant de la même classe : la classe A.
    Cette liste l comporte plusieurs objets A1, A2, A3.
    Ensuite j'ai une méthode play() /* avant je l'avais appelée dessiner() */ dans A qui est redéfinie dans A1, A2, A3.
    Dans A1 je veux quelle dessine(tout le temps) l'objet A1, dans A2 je veux quelle modifie la couleur de l'objet A1 associé, dans A3 je veux quelle empêche le A1 associé de se dessiner.

    Pour l'instant je n'ai redéfini play() que dans A1, mais ce que je comprend c'est que chaque fois que je dessine un objet les précédents n'apparaissent plus alors que je n'ai pas fait de clearRect(...).
    Je veux d'abord réglé ce problème avant de rédéfinir play() dans A2 et A3 ce qui va être compliqué.
    Voilà, est-ce plus claire?

Discussions similaires

  1. Instancier plusieurs objets malgré un constructeur privée
    Par derlone dans le forum Débuter avec Java
    Réponses: 2
    Dernier message: 01/05/2009, 22h37
  2. [Debutant]Dessiner dans plusieurs JPanels. Probleme
    Par ahage4x4 dans le forum AWT/Swing
    Réponses: 5
    Dernier message: 22/05/2006, 12h32
  3. [VBA-E] Conserver une variable pour plusieurs modules
    Par pilote301152 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 13/05/2006, 13h14
  4. Requêtes : recherche de maxi sur plusieur Objet
    Par pertuis dans le forum Langage SQL
    Réponses: 6
    Dernier message: 08/03/2004, 15h28
  5. Comment mettre plusieurs objets ds un composant ?
    Par Fleury dans le forum Composants VCL
    Réponses: 7
    Dernier message: 24/05/2003, 17h34

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