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 :

[Stratégie] Afficher une animation dans un JScrollPane


Sujet :

AWT/Swing Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    422
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2004
    Messages : 422
    Par défaut [Stratégie] Afficher une animation dans un JScrollPane
    Bonjour,


    Je souhaite faire des animations en utilisant la classe Graphics dans un JScrollPane.

    Comment pourrais-je modifier le code suivant pour utiliser l'animation dans un JScrollPane ?

    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
    81
    82
    83
    84
    85
    86
    87
     
    import java.awt.*; 
    import java.awt.image.*;
    import java.util.Random;
     
    public class DoubleBufferingSoftware extends Frame{
     
       // boucle d'affichage	
       RenderingThread renderingThread = new RenderingThread();
     
       // buffer mémoire (2eme buffer)
       Graphics buffer;
     
       // image mémoire correspondante au buffer   
       Image image; 
     
       int x = 0; // coordonnée x de l'affichage du texte
     
       int x1,y1,x2,y2; // coordonnée x de l'affichage de la ligne
     
     
       public DoubleBufferingSoftware(){
          //affichage
          setSize( 400, 400 );
          setVisible( true );
     
          Random rand = new Random(System.currentTimeMillis()); // constructeur
    	  x1 = rand.nextInt(10); // génération
          y1 = rand.nextInt(10); // génération
          x2 = rand.nextInt(10); // génération
          y2 = rand.nextInt(10); // génération
     
     
          // on démarre la bouche d'affichage
          renderingThread.start();
     
       }
     
       public void update(Graphics g){
          paint(g);
       }
     
       public void paint( Graphics g ){
       	  //création du buffer si il n'existe pas
       	  if(buffer==null){
       	     image = createImage(400,400);
             buffer = image.getGraphics();	
       	  }
       	  //on dessine sur le buffer mémoire
          buffer.setColor( Color.white );
          buffer.fillRect( 0, 0, 400, 400 );
          buffer.setColor( Color.black );
          buffer.drawString( "affichage d'une ligne de texte", x, 200 );
          buffer.setColor( Color.red );
          buffer.drawLine(x1,y1,x2,y2);
          x++;
     
     
          if(x>400) x = 0;
          // finalement, le buffer mémoire est dessiné dans le buffer d'affichage
          g.drawImage(image, 0, 0, this);
     
       }
     
     
     
       class RenderingThread extends Thread {
       	  /**
               *  Ce thread appelle le rafraichissement de notre fenêtre 
               *  toutes les 10 milli-secondes
               */
          public void run(){
             while(true){
                try {
                   repaint(); 
                   sleep( 10 );
                } catch ( Exception e ) {} 
             }
          }
       }   
     
     
     
       public static void main(String[] args) {
       		new DoubleBufferingSoftware();
       }
    }
    merci

  2. #2
    Gfx
    Gfx est déconnecté
    Expert confirmé
    Avatar de Gfx
    Inscrit en
    Mai 2005
    Messages
    1 770
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Par défaut
    Au lieu d'heriter de JFrame, herite de JComponent ou de JPanel. Ensuite tu crees une instance de ta classe que tu mets dans un JScrollPane.

  3. #3
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 901
    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 901
    Billets dans le blog
    54
    Par défaut
    Pour une animation de base, avec un code proche de l'original.

    Remplacer la classe de base :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    public class DoubleBufferingSoftware extends JPanel {
    En plus de setSize() faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Dimension size = new Dimension(400, 400);
    setPrefferredSize(size); 
    setMinimumSize(size);
    Déplacer le code d'initialisation et d'affichage de la JFrame/Frame ailleurs.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    JFrame frame = new JFrame("Anim");
    frame.setLayout(new BorderLayout()):
    frame.add(new JScrollPane(new DoubleBufferingSoftware()), BorderLayout.CENTER);
    frame.pack();
    frame.setVisible(true);
    Enlever :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    public void update(Graphics g){ 
          paint(g); 
       }
    car ce n'est pas nécessaire.

    Remplacer paint() par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    protected void paintComponent( Graphics g ){ 
      super.paintComponent(g);  // Utile si ton image est transparente et/ou si ton panel est plus grand que l'image.
      ...
    Note : faudrait voir avec Gfx ou d'autres qui sont plus orientés graphisme mais ne vaudrait'il mieux pas faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    if (image == null) {
      image = new BufferedImage(400, 400, ...); // Avec le type qui va bien.
    }
    Graphics buffer = image.createGraphics(); // Dans ce cas penser à changer la déclaration de la variable image.
    ...
    graphics.dispose();
    à chaque boucle histoire d'éviter des fuites mémoires dut à la non-libération des resources graphiques.
    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

  4. #4
    Gfx
    Gfx est déconnecté
    Expert confirmé
    Avatar de Gfx
    Inscrit en
    Mai 2005
    Messages
    1 770
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Par défaut
    Ben en fait Swing etant maintenant double-bufferise automatiquement il n'y meme pas a se soucier de passer par une BufferedImage intermediaire. Cette solution est interessante lorsque l'on dessine de nombreuses primitives qui ne changent pas forcement d'un appel a l'autre de paintComponent(). Perso je ferais ca :

    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
     
    public class DoubleBufferingSoftware extends Frame{
       int x = 0; // coordonnée x de l'affichage du texte
       int x1,y1,x2,y2; // coordonnée x de l'affichage de la ligne
       Timer timer;
     
       public DoubleBufferingSoftware(){
          Random rand = new Random(System.currentTimeMillis()); // constructeur
         x1 = rand.nextInt(10); // génération
          y1 = rand.nextInt(10); // génération
          x2 = rand.nextInt(10); // génération
          y2 = rand.nextInt(10); // génération
     
     
          // on démarre la bouche d'affichage
          timer = new Timer(10, new ActionListener() {
            public void actionPerformed(ActionEvent evt) {
              repaint();
            }
          });
          timer.start();
       }
     
       protected void paintComponent(Graphics g) {
          g.setColor(Color.WHITE);
          g.fillRect(0, 0, 400, 400);
          g.setColor(Color.BLACK);
          g.drawString("affichage d'une ligne de texte", x, 200);
          g.setColor(Color.RED);
          g.drawLine(x1,y1,x2,y2);
          x++;
     
          if(x>400) x = 0;
       }
    }
    Le double buffering est rendu inutile par le fait qu'on ne surcharge plus update().

  5. #5
    Gfx
    Gfx est déconnecté
    Expert confirmé
    Avatar de Gfx
    Inscrit en
    Mai 2005
    Messages
    1 770
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Par défaut
    Si tu veux des exemples d'animations avec des composants Swing, les Timer, etc. tu peux consulter le code source de mes dernieres demos :

    http://www.jroller.com/page/gfx/?anchor=drag_and_drop_effects_part

    http://www.jroller.com/page/gfx/?anchor=real_world_physics_in_swing

  6. #6
    Membre très actif
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    422
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2004
    Messages : 422
    Par défaut
    J'ai essayé la solution de bouye. Cela ne marche pas.

    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
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
     
    import java.awt.*; 
    import java.awt.image.*;
    import java.util.Random;
    import javax.swing.*;
     
     
    public class DoubleBufferingSoftware2 extends JPanel{
     
       // boucle d'affichage	
       RenderingThread renderingThread = new RenderingThread();
     
       // buffer mémoire (2eme buffer)
       Graphics buffer;
     
       // image mémoire correspondante au buffer   
       Image image; 
     
       int x = 0; // coordonnée x de l'affichage du texte
     
       int x1,y1,x2,y2; // coordonnée x de l'affichage de la ligne
     
     
       public DoubleBufferingSoftware2(){
          //affichage
          //setSize( 400, 400 );
    	  Dimension size = new Dimension(400, 400);
    	  setPreferredSize(size);
          setMinimumSize(size);       
     
          setVisible( true );
     
          Random rand = new Random(System.currentTimeMillis()); // constructeur
    	  x1 = rand.nextInt(10); // génération
          y1 = rand.nextInt(10); // génération
          x2 = rand.nextInt(10); // génération
          y2 = rand.nextInt(10); // génération
     
     
          // on démarre la bouche d'affichage
          renderingThread.start();
     
       }
     
       public void update(Graphics g){
          paint(g);
       }
     
       public void paint( Graphics g ){
       	  //création du buffer si il n'existe pas
       	  if(buffer==null){
       	     image = createImage(400,400);
             buffer = image.getGraphics();	
       	  }
       	  //on dessine sur le buffer mémoire
          buffer.setColor( Color.white );
          buffer.fillRect( 0, 0, 400, 400 );
          buffer.setColor( Color.black );
          buffer.drawString( "affichage d'une ligne de texte", x, 200 );
          buffer.setColor( Color.red );
          buffer.drawLine(x1,y1,x2,y2);
          x++;
     
     
          if(x>400) x = 0;
          // finalement, le buffer mémoire est dessiné dans le buffer d'affichage
          g.drawImage(image, 0, 0, this);
     
       }
     
     
     
       class RenderingThread extends Thread {
       	  /**
               *  Ce thread appelle le rafraichissement de notre fenêtre 
               *  toutes les 10 milli-secondes
               */
          public void run(){
             while(true){
                try {
                   repaint(); 
                   sleep( 10 );
                } catch ( Exception e ) {} 
             }
          }
       }   
     
     
     
       public static void main(String[] args) {
       		new DoubleBufferingSoftware2();
       		JFrame frame = new JFrame();
       		frame.setLayout( new BorderLayout());
       		frame.add( new JScrollPane( new DoubleBufferingSoftware2()), BorderLayout.CENTER);
       		frame.pack();
       		frame.setVisible(true);
       }
    }

  7. #7
    Membre très actif
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    422
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2004
    Messages : 422
    Par défaut
    gfx, ton code marche nickel.

    Mais maintenant comment faire pour utiliser l'anim dans le Jscrollpane?

  8. #8
    Gfx
    Gfx est déconnecté
    Expert confirmé
    Avatar de Gfx
    Inscrit en
    Mai 2005
    Messages
    1 770
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Par défaut
    ben new JScrollPane(new LaClasseDeLAnimation())

  9. #9
    Membre très actif
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    422
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2004
    Messages : 422
    Par défaut
    çà marche. youpie.

    Merci


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

Discussions similaires

  1. Afficher une animation 3D VRML dans VB6
    Par ballidanse dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 15/10/2012, 17h03
  2. Afficher une image dans un JScrollPane
    Par poustiquette dans le forum AWT/Swing
    Réponses: 1
    Dernier message: 10/11/2009, 21h45
  3. [MFC] afficher une ProgressBar dans une barre d'etat
    Par guillaume21 dans le forum MFC
    Réponses: 5
    Dernier message: 30/03/2007, 11h16
  4. Afficher une icone dans DBgrid
    Par boyerf dans le forum Bases de données
    Réponses: 4
    Dernier message: 29/02/2004, 15h45
  5. Réponses: 3
    Dernier message: 28/01/2004, 14h55

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