Partage
  • Partager sur Facebook
  • Partager sur Twitter

lag rechargement d'image

Sujet résolu
    14 mars 2012 à 22:44:27

    Bonjour,
    J'ai crée petit programme swing qui me pose problème.
    Tout d'abord je met en fond une image de plus de 4 mega octets.
    Puis je pose un pion que je fais bouger dans la méthode initialise pion.
    Mais un probleme: ca rame!!! :(
    voilà la classe qui crée la Fenetre et qui initialise le pion:
    import java.awt.Container;
    import java.awt.Dimension;
    import java.awt.FlowLayout;
    import java.awt.Point;
    import java.awt.Toolkit;
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;
    
    import javax.swing.ImageIcon;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    
    import Joueur.Joueur;
    import Ville.Ville;
     
    public class Fenetre extends JFrame{
       
         public Fenetre(){
    
             this.setTitle("MTest");
             this.setLocationRelativeTo(null);
             this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
             this.setExtendedState(this.MAXIMIZED_BOTH);
             this.setUndecorated(true);
             this.setContentPane(new Map());//création de la map
             this.setLayout(null);
             this.setVisible(true);
             
             
         }
         JLabel initialise_pion(Joueur j,Ville atlanta) {
     		
     		JLabel label = new JLabel();
     		
     		ImageIcon image = new ImageIcon(Toolkit.getDefaultToolkit().getImage("pion"+j.getCode_couleur()+".png"));
     		
     		label.setPreferredSize(new Dimension(image.getIconWidth(), image.getIconHeight()));
     		label.setIcon(image);
            
           
     		add(label);
     		label.setBounds(atlanta.getPosition().x+j.getDecal_x(),atlanta.getPosition().y+j.getDecal_y(),50,80);
     		
     		int i=0;
     		int x=atlanta.getPosition().x+j.getDecal_x();
     		int y=atlanta.getPosition().y+j.getDecal_y();
     		for( i = 0; i < 500; i++)
            {
     			i++;
     			label.setBounds(x+i,y+i,50,80);
     			System.out.println(i);
     			setVisible(true);
     			try {
                    Thread.sleep(80);
            } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                    
            }}
    
    		return label;
     	}
    
         
    }
    

    Voici le code qui crée la Map
    public class Map extends JPanel {
    
            public void paintComponent(Graphics g){
                    try {
                    		JPanel Plateau = new JPanel();
                            Image img = ImageIO.read(new File("JPEG.jpg"));
                            g.drawImage(img, 2, 2,1436,902,this);
                            addMouseListener(new Moustener());
                    } catch (IOException e) {
                            e.printStackTrace();
                    }
                    
            }               
            private class Moustener extends MouseAdapter
            {
                public void mouseClicked(MouseEvent evt)
               {
                  int xClic = evt.getX();
                  int yClic = evt.getY();
                  System.out.println("xClic/yClic: "+ xClic + "/" + yClic);
               }
            }
    }
    

    Si je change l'image de fond par une image bien moins volumineuse comme 2ko(que je resize à la meme taille), aucun problème, le pion se déplace sans saccader. Le problème est donc qu'à chaque déplacement de mon JLabel la grosse image en fond d'écran se recharge. Comment éviter ca?
    • Partager sur Facebook
    • Partager sur Twitter
      14 mars 2012 à 22:56:13

      À mon avis le problème vient du fait qu'a à chaque déplacement tu recharges l'image. Tu peux essayer de la mettre en attribut de la classe Map puisque l'image de fond ne change pas, et à chaque déplacement au lieu d'aller rechercher l'image et de la recharger dans une variable, tu utilises l'attribut que tu auras chargé lors de l'instanciation de la classe Map.

      En gros:
      - dans ta classe Fenetre tu mets un attribut de type Map
      - dans ta classe Map tu mets un attribut de type img

      Je sais pas si ça peut fonctionner (je pense que oui), mais le mieux c'est d'essayer :p
      • Partager sur Facebook
      • Partager sur Twitter
      ⚙️ Une solution simple règle le problème ; une solution compliquée en crée un nouveau.
        15 mars 2012 à 0:19:04

        Impressionnant!! Parfait! Bravo! ^^
        Le déplacement n'est plus saccadé je vais pouvoir continuer à bosser! ;)
        Une dernière question:
        Tu semble persuadé qu'il faille recharger l'image. Ceci est une obligation en swing?
        En tout cas merci! :D
        • Partager sur Facebook
        • Partager sur Twitter
          16 mars 2012 à 12:13:25

          EDIT: Je viens de comprendre la question :D

          Honnêtment je ne sais pas si il y a moyen de faire autrement.
          Je sais juste qu'avec Swing le problème c'est que quand tu ajoutes un composant, celui-ci est passé au dernier plan, du coup si tu redessines ton pion sans toucher au fond, il va être dessiné derrière ton fond et tu ne le verras pas. Du coup à chaque fois obligé de redessiner le fond après avoir redessiné le pion pour que ce dernier soit visible et au premier plan.
          • Partager sur Facebook
          • Partager sur Twitter
          ⚙️ Une solution simple règle le problème ; une solution compliquée en crée un nouveau.

          lag rechargement d'image

          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
          • Editeur
          • Markdown