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

EDT/SwingWorker Java Discussion :

Problème avec l'instruction Thread.sleep


Sujet :

EDT/SwingWorker Java

  1. #21
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Par "avant d'ouvrir la fenêtre", je voulais dire "avant d'afficher la fenêtre" : tout ce qui peut prendre du temps et que tu fais entre le moment où la fenêtre est visible et le moment où la première image du premier panneau s'affiche, contribue au délai dont tu parlais. En plus, effectivement, le fait de sortir le chargement de l'image d'une méthode exécutée dans le thread swing, evite de faire des accès disques, relativement long, et en plus répétés inutilement à chaque affichage.

    Tu peux faire tout simplement, par exemple (voir les commentaires dans le code) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    public class Panneau extends JPanel { 
     
            private final Image image;
     
            public Panneau(Image image) {
                this.image=image;
            }
     
    	public void paintComponent(Graphics g){
    		if ( IMAGE!=null ) g.drawImage(IMAGE, 0, 0, this.getWidth(), this.getHeight(), this);
    	}               
     
    }
    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
     
    public class Fenetre extends JFrame {
     
    	public Fenetre() {         
    		super();
    		init(); 
    	}
     
            private Image readImage(String imagePath) {
    		try {
    			return ImageIO.read(new File(imagePath));
    			// return ImageIO.read(getClass().getResource(imagePath)); // tu pourrais faire comme ça, en plus, si tu exportes ton appli en jar, tu n'auras pas de problèmes d'emplacement de fichiers et tu pourras les intégrer dans le jar 
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
                    return null;
            }
     
    	private void init () {
     
                    final JPanel panneau1=new Panneau(readImage("image1.jpg"));
                    final JPanel panneau2=new Panneau(readImage("image2.jpg"));
    		ActionListener listener = new ActionListener (){ // <- accolade de début de classe anonyme
    			private int pan = 0;
    			@Override
    			public void actionPerformed(ActionEvent evt) {
    				switch(pan++% 2){
    				case (0):Fenetre.this.setContentPane(panneau1); Fenetre.this.validate(); break;
    				case (1):Fenetre.this.setContentPane(panneau2); Fenetre.this.validate(); break;
    				}      
    			}
    		};
    		Timer timer = new Timer (1000, listener);
                    timer.setInitialDelay(0);
                    // on a fait un max de choses avant d'ouvrir/afficher la fenêtre
     
    		this.setTitle("Série d'images");
    		this.setSize(500, 500);
    		this.setLocationRelativeTo(null);
    		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
                    // enfin ça aussi, on peut considérer que ça fait partie des max de choses à faire avant d'ouvrir/afficher la fenêtre
     
                    this.setContentPane(panneau); // afficher par défaut l'image correspondant à 1%2==0 (donc la fenêtre n'apparaitra jamais "grise")
                    // si pas setInitialDelay(0) this.setContentPane(panneau2); // afficher par défaut l'image correspondant ) à 1%2==1
     
    		this.setVisible(true);
    		timer.start ();
     
    	}
    }
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  2. #22
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Cafeinoman Voir le message
    Par exemple, dans ta classe panneau, tu modifie la méthode pour qu'elle prenne une image en paramètre plutôt que de charger l'image.
    Je suppose que tu voulais dire "modifier le constructeur", parce que là, on risque de penser que tu parles de modifier la méthode paintComponent...

    Citation Envoyé par Cafeinoman Voir le message
    ...

    et dans le switch, tu remplace par panneau.setImage(ChargeurImage.image1).paint();
    La le .paint(), soit il a rien à faire là, soit il manque des détails dans tes explications sur le type retourné par setImage(...), soit tu tapes encore depuis ton téléphone et le réveil est difficile

    Citation Envoyé par Cafeinoman Voir le message
    .Ca t'évite de faire de l'IO dans tes composants graphique, ainsi qu'un certain nombre d'instanciation inutiles d'un même objet.
    Oui, pour résumé, c'était ça l'idée
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #23
    Membre éprouvé
    Avatar de Cafeinoman
    Homme Profil pro
    Couteau suisse d'une PME
    Inscrit en
    Octobre 2012
    Messages
    628
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Couteau suisse d'une PME

    Informations forums :
    Inscription : Octobre 2012
    Messages : 628
    Points : 1 256
    Points
    1 256
    Par défaut
    Citation Envoyé par joel.drigo Voir le message
    La le .paint(), soit il a rien à faire là, soit il manque des détails dans tes explications sur le type retourné par setImage(...), soit tu tapes encore depuis ton téléphone et le réveil est difficile
    Les deux mon commandant ! Après une heure de métro et avec un pc, l'idée c'était ça :

    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
     
    public class Panneau extends JPanel { 
     
            private Image image;
     
            public Panneau() {
            }
     
            public void afficher() { // c'est mieux que paint() comme non, ça évite les confusion...
                   	if ( image!=null ) {
                           paintComponent(this.getGraphics());
                    }
            }
     
    	public void paintComponent(Graphics g){
    		g.drawImage(this.image, 0, 0, this.getWidth(), this.getHeight(), this);
    	}               
     
            public Panneau setImage(Image image){
                    this.image = image;
            }
    }
    Tout en externalisant le readImage vers une autre classe histoire de ne pas avoir du tout d'IO dans les classes swing... Mais ta méthode me semble meilleure (l'expérience peut-être )
    «Dieu ne joue pas aux dés.» - Albert Einstein. Et pan! 30 ans de retard dans la théorie quantique!
    «Tout n'est pas politique, mais la politique s'intéresse à tout.» - Nicolas Machiavel. Et surtout à ceux qui ne s'y intéressent pas.

  4. #24
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Accessoirement, le plus simple pour afficher une image en java, ce n'est pas de surcharger paintComponent. C'est d'utiliser à la place de ton JPanel un JLabel et sa méthode setICon.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    label.setIcon(new ImageIcon(Toolkit.getDefaultToolkit().getImage(location)));
    Ce qui a l'avantage de gérer le caching des images et la taille du label, entre autres.

  5. #25
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    Accessoirement, le plus simple pour afficher une image en java, ce n'est pas de surcharger paintComponent. C'est d'utiliser à la place de ton JPanel un JLabel et sa méthode setICon.
    Certes, au détail près, que l'image s'affichera dans sa taille d'origine.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  6. #26
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Il n'a jamais été question de redimensionnement dans ce sujet et le code montré ne fait aucun redimensionnement

  7. #27
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Je ne parlais pas de redimensionnement mais d'étendre l'image à la taille "courante", comme dans le code posté par @DMIII :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    public class Panneau extends JPanel { 
    	public void paintComponent(Graphics g){
    		try {
    			BufferedImage img = ImageIO.read(new File("images.jpg"));
    			g.drawImage(img, 0, 0, this.getWidth(), this.getHeight(), this);
    		} catch (IOException e) {
    			e.printStackTrace();
     
    		}
    	}               
    }
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  8. #28
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Le jlabel fonctionne comme cela aussi, il ne dessine que sur la zone qui lui est attribuée, comme tous les composants, je ne vois pas où tu veux en venir du coup

  9. #29
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Ah bon ? J'ai toujours constaté au contraire, en SWING, que l'affichage de l'image se faisait dans sa taille (celle de l'image dans le fichier), et non pas dans la taille du JLabel : si l'image fait 48 x 48 et que mon JLabel fait 1000x1000, j'ai une image de 48x48 affichée (au milieu, si j'ai un alignement CENTER) d'un rectangle gris de 1000x1000. Comment fais-tu pour que l'image s'affiche en 1000x1000 ?
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  10. #30
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Au temps pour moi, j'ai mal lu la javadoc de cette version de drawImage. Je me suis arrêté à la définition courte:

    Draws as much of the specified image as has already been scaled to fit inside the specified rectangle.
    Et comme en dessous il y a une autre version de drawImage

    Draws as much of the specified area of the specified image as is currently available, scaling it on the fly to fit inside the specified area of the destination drawable surface.
    J'ai cru qu'avec la première, il n'y avait pas de redimensionnement de l'image

    Et effectivement, si tu veux du fitting de l'image au composant, il ne faut pas utiliser JLabel.

  11. #31
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2014
    Messages : 14
    Points : 6
    Points
    6
    Par défaut
    Merci pour votre aide, j'ai personnellement essayé avec la méthode de joel.drigo et cela fonctionne sans délai de latence. Du coup je me demande si il est possible que le contenu du actionPerformed ne s'exécute qu'un nombre fini de fois (par exemple 5 fois ou 10 fois) : j'ai essayé d'encadrer la méthode avec un "if" mais ça ne marche pas.
    En fait, pour ne rien vous cacher, mon programme consiste à afficher des images de molécules (par exemple 5 images à la suite), puis de demander à l'utilisateur laquelle de ces molécules était par exemple un alcool. Du coup ça m'amène aussi à me poser une deuxième question : est-il possible d'afficher des images de manière aléatoire ? Je m'explique : si je possède un dossier contenant un grand nombre d'images nommées "image1.jpg" "image2.jpg" "image3.jpg", etc... existe-t-il un moyen de charger une image au hasard parmi toutes les images ?

    Je poste le code des deux classes qu'il reste, étant donné que vos méthodes me permettent d'éliminer la classe Panneau2 et de ne conserver qu'une seule classe Panneau pour afficher le images sur la fenêtre.
    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
     
    public class Fenetre extends JFrame {
     
    	public Fenetre() {         
    		super();
    		init(); 
    	}
     
    	private Image readImage(String imagePath) {
    		try {
    			return ImageIO.read(new File(imagePath));
    			// return ImageIO.read(getClass().getResource(imagePath)); // tu pourrais faire comme ça, en plus, si tu exportes ton appli en jar, tu n'auras pas de problèmes d'emplacement de fichiers et tu pourras les intégrer dans le jar 
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    		return null;
    	}
     
    	private void init () {
     
    		final JPanel panneau1=new Panneau(readImage("images.jpg"));
    		final JPanel panneau2=new Panneau(readImage("zidane.jpg"));
    		ActionListener listener = new ActionListener (){ // <- accolade de début de classe anonyme
    			private int pan = 0;
    			@Override
    			public void actionPerformed(ActionEvent evt) {
    				switch(pan++% 2){
    				case (0):Fenetre.this.setContentPane(panneau1); Fenetre.this.validate(); break;
    				case (1):Fenetre.this.setContentPane(panneau2); Fenetre.this.validate(); break;
    				}      
    			}
    		};
    		Timer timer = new Timer (1000, listener);
    		timer.setInitialDelay(0);
    		// on a fait un max de choses avant d'ouvrir/afficher la fenêtre
     
    		this.setTitle("Série d'images");
    		this.setSize(500, 500);
    		this.setLocationRelativeTo(null);
    		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
    		// enfin ça aussi, on peut considérer que ça fait partie des max de choses à faire avant d'ouvrir/afficher la fenêtre
     
    		this.setContentPane(panneau1); // afficher par défaut l'image correspondant à 1%2==0 (donc la fenêtre n'apparaitra jamais "grise")
    		// si pas setInitialDelay(0) this.setContentPane(panneau2); // afficher par défaut l'image correspondant ) à 1%2==1
     
    		this.setVisible(true);
    		timer.start ();
     
    	}
    }

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public class Panneau extends JPanel { 
     
    	private final Image image;
     
    	public Panneau(Image image) {
    		this.image=image;
    	}
     
    	public void paintComponent(Graphics g){
    		if ( image!=null ) g.drawImage(image, 0, 0, this.getWidth(), this.getHeight(), this);
    	}               
     
    }

  12. #32
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    La classe Random te permet de générer des nombres aléatoires, sous différentes contraintes. A toi de les utiliser correctement après.

    Pour arrêter le timer, il suffit de faire


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    leTimerConcerné.stop();

  13. #33
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2014
    Messages : 14
    Points : 6
    Points
    6
    Par défaut
    Oui mais du coup, si je place le timer.stop() juste après le timer.start(), ça n'effectue qu'une seule fois le contenu de actionPerformed, alors qu'il faudrait que ça l'effectue un nombre précis de fois. Sinon en ce qui concerne le Random, je m'apprêtais à poster que je ne comprenais pas comment un nombre généré aléatoirement pouvait intervenir dans le chemin d'accès d'une image, mais je viens d'essayer et ça marche : en effet, d'après ce que j'ai compris, il est possible d'écrire une ligne du type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    readImage("images/images/acides_carboxyliques/image"+nombreAleatoire+".png"));
    c'est à dire pour que ça m'ouvre au hasard le fichier "image45.png" ou "image12.png".etc...

    Mon seul problème reste donc le fait que le contenu du actionPerformed ne s'effectue qu'un nombre précis de fois.

  14. #34
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Ce que tu peux faire, c'est charger un tableau d'images (si elles ne sont pas trop grosses non plus, parce qu'il ne s'agit pas de saturer la mémoire non plus), ensuite, dans l'action du timer, tu utilises un compteur que tu incrémentes, de 0 à 4 (pour chaque image), en allant donc à chaque fois chercher l'image correspondante dans le tableau, et pour arrêter le timer quand tu as atteint la fin du tableau (donc quand le compteur dépasse la taille du tableau), appeler this.stop(), ce qui arrêtera le timer,.

    A partir, d'un moment, l'évolution de ton prog, va peut être justifier du regarder du côté des SwingWorker : on n'est pas dans le traitement long avec mise à jour de l'UI à la fin, mais c'est assez similaire finalement (à la place d'une barre de progression, tu as des images successives, et à la place d'un traitement long, tu as des IO), la (petite) difficulté peut être avec le SwingWorker, c'est le temps d'attente entre chaque mise à jour de l'UI.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  15. #35
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2014
    Messages : 14
    Points : 6
    Points
    6
    Par défaut
    Mes images sont en fait assez grandes... enfin ça dépend ce que l'on entend par "grandes" : certaines ont une résolution de 500 x 300 ou quelque chose comme ça, mais d'autres ont des résolutions du type 1650 x 500, donc je me pose aussi la question de savoir si je laisse la classe Panneau tel quel, avec des images qui seront du coup agrandies à la résolution de l'écran, ou alors je garde de plus petites images, mais le problème est que je ne sais pas comment centrer les images au milieu de la fenêtre.
    Ah oui, j'ai un autre problème qui est apparu : lorsque je lance le programme, la première image s'affiche normalement, mais la seconde s'affiche par dessus la première, puis elle s'enlève, et à partir de là le reste se déroule normalement. Je ne sais pas à quoi c'est dû, j'ai fait quelques modifications mais il ne me semble pas qu'elles aient une répercussion sur ça. Voici le code :

    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
    public class Fenetre extends JFrame {
     
    	public Fenetre() {         
    		super();
    		init(); 
    	}
     
    	private Image readImage(String imagePath) {
    		try {
    			return ImageIO.read(new File(imagePath));
    			// return ImageIO.read(getClass().getResource(imagePath)); // tu pourrais faire comme ça, en plus, si tu exportes ton appli en jar, tu n'auras pas de problèmes d'emplacement de fichiers et tu pourras les intégrer dans le jar 
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    		return null;
    	}
     
    	private void init () {
    		int nombreAleatoire = 1 + (int)(Math.random() * ((12)));
    		int nombreAleatoire2 = 1 + (int)(Math.random() * ((12)));
     
    		final JPanel panneau1=new Panneau(readImage("images/images/acides_carboxyliques/"+nombreAleatoire+".png"));
    		final JPanel panneau2=new Panneau(readImage("images/images/alcanes/"+nombreAleatoire2+".png"));
    		ActionListener listener = new ActionListener (){ // <- accolade de début de classe anonyme
    			private int pan = 0;
    			@Override
    			public void actionPerformed(ActionEvent evt) {
    				switch(pan++% 2){
    				case (0):Fenetre.this.setContentPane(panneau1); Fenetre.this.validate(); break;
    				case (1):Fenetre.this.setContentPane(panneau2); Fenetre.this.validate(); break;
    				}      
    			}
    		};
    		Timer timer = new Timer (2000, listener);
    		timer.setInitialDelay(0);
    		// on a fait un max de choses avant d'ouvrir/afficher la fenêtre
     
     
    		this.setTitle("Série d'images");
    		this.setSize(500, 500);
    		this.setLocationRelativeTo(null);  
    		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     
    		// enfin ça aussi, on peut considérer que ça fait partie des max de choses à faire avant d'ouvrir/afficher la fenêtre
     
    		this.setContentPane(panneau1); // afficher par défaut l'image correspondant à 1%2==0 (donc la fenêtre n'apparaitra jamais "grise")
    		// si pas setInitialDelay(0) this.setContentPane(panneau2); // afficher par défaut l'image correspondant ) à 1%2==1
     
    		this.setVisible(true);
    		timer.start ();
     
    	}

  16. #36
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2014
    Messages : 14
    Points : 6
    Points
    6
    Par défaut
    Quelqu'un a une idée ?

  17. #37
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2014
    Messages : 14
    Points : 6
    Points
    6
    Par défaut
    Bonjour,
    En fait j'ai réglé ce problème : il fallait rajouter super.paintComponent(g) dans ma classe Panneau, pour que les images se dessinent correctement.

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. Problème avec repaint() et Thread.sleep
    Par fab13 dans le forum AWT/Swing
    Réponses: 7
    Dernier message: 12/08/2008, 23h02
  2. [aide]probléme avec l'instruction group by
    Par diden138 dans le forum Bases de données
    Réponses: 4
    Dernier message: 25/05/2007, 07h09
  3. Problème avec une instruction VBA
    Par Jpeg69 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 22/05/2007, 12h58
  4. Problème avec l'instruction IN : 16 bits retournés
    Par HadiNET dans le forum Assembleur
    Réponses: 4
    Dernier message: 11/02/2006, 17h43
  5. Problème avec une instruction OUTER /Postgres
    Par Volcomix dans le forum Langage SQL
    Réponses: 14
    Dernier message: 21/04/2004, 16h56

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