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

avec Java Discussion :

Je charge aléatoirement des méthodes que je n’appelle pas !


Sujet :

avec Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de tarpal
    Homme Profil pro
    Ingénieur Electronique retraité
    Inscrit en
    Février 2016
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur Electronique retraité
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2016
    Messages : 70
    Par défaut Je charge aléatoirement des méthodes que je n’appelle pas !
    Bonjour.
    J'ai un soucis avec une boucle for.
    Voilà ce que je veux faire:
    Quand je clique sur un bouton (but2) je veux appeler successivement 3 méthodes les unes après les autres.
    Pour cela j'ai fait une boucle for avec un break; à la fin.
    Mon soucis c'est que après la boucle, j'appelle aléatoirement les méthodes sans que je le veuille.
    J'ai mis des flags (println) dans mes méthodes pour vérifier et savoir ce qui se passe.
    voilà ce que j'ai dans ma console :
    i=3
    Maintenant :je suis dans la class Traitementbut2 !
    je suis dans la boucle PanneauDeux

    i=2
    je suis toujours dans la class Traitementbut2
    Je suis dans la boucle PanneauTestTrois !

    i=1
    je suis toujours dans la class Traitementbut2
    Je suis dans la boucle PanneauTestQuatre !
    C'est fini

    Je suis dans la class PanneauTestTrois
    Je suis dans la class PanneauTestQuatre
    Je suis dans la class PanneauTestDeux!
    je ne comprends pas pourquoi après i=1 ( c'est fini ) je charge les méthodes aléatoirement ( voir les 3 dernières lignes)
    voici mon 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
        public class Traitementbut2 implements ActionListener
          {
             public void actionPerformed(ActionEvent e)
             {
            	 for (int i=3 ; i>0 ; i--)
                {
            	if (i==3)
            	{
            	System.out.println(" ");
            	System.out.println("i="+i);
                System.out.println(" Maintenant :je suis dans la class Traitementbut2 !");
                System.out.println(" je suis dans la boucle PanneauDeux");
                FenetreTest.this.getContentPane().add(new PanneauTestDeux());
    			FenetreTest.this.revalidate();
            	} 
            	if(i==2)
            	{
            	System.out.println(" ");
            	System.out.println("i="+i);
            	System.out.println(" je suis toujours dans la class Traitementbut2");
    			System.out.println("Je suis dans la boucle PanneauTestTrois !");
                FenetreTest.this.getContentPane().add(new PanneauTestTrois());
    			FenetreTest.this.revalidate();
            	}
            	if(i==1)
            	{
            	System.out.println(" ");
            	System.out.println("i="+i);
    			System.out.println(" je suis toujours dans la class Traitementbut2");
                System.out.println("Je suis dans la boucle PanneauTestQuatre !");
                System.out.println("C'est fini");
                System.out.println(" ");
                FenetreTest.this.getContentPane().add(new PanneauTestQuatre());
    			FenetreTest.this.revalidate();
    			break;
            	}
    	        }
     
              }
           }
    Vous avez compris que mes méthodes se trouvent dans les class "PanneauTestDeux" "PanneauTestTrois" et "PanneauTestQuatre" successivement.
    et que j'appelle avec la méthode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     FenetreTest.this.getContentPane().add(new PanneauTestDeux());
    Si ça se trouve mon problème ne vient pas de la boucle ...
    Merci pour votre aide
    A+

  2. #2
    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 : 55
    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
    Billets dans le blog
    2
    Par défaut
    Salut,

    Les trois derniers messages ne proviennent effectivement pas de cette boucle (on ne les y voit nullepart ces messages). Il faudrait savoir où est fait l'affichage de chacun de ces messages.
    En tout cas, avec ta boucle, tu ajoutes 3 panneaux dans le contentpane d'une frame.
    Le break n'est pas utile, puisque i vaut 1, à la fin de l'itération il sera décrémenté, vaudra donc 0, donc le test i>0 sera faux, donc la boucle s'arrêtera d'elle-même.
    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. #3
    Membre confirmé Avatar de tarpal
    Homme Profil pro
    Ingénieur Electronique retraité
    Inscrit en
    Février 2016
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur Electronique retraité
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2016
    Messages : 70
    Par défaut
    Bonsoir,
    J'avais bien constaté que ma boucle fonctionnait ( même sans le break; )
    Quant à l'affichage des trois messages ils viennent de méthodes appelées.
    En fait pour bien vérifier si ma méthode est correctement appelée j'ai mis un println dans mes class
    Voici une des class appelée :
    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
    package testGraphics;
     
    import java.awt.Graphics;
    import java.io.IOException;
    import java.awt.Image;
    import javax.imageio.ImageIO;
    import javax.swing.JPanel;
    import java.io.File;
     
    public class PanneauTestDeux extends JPanel
    {
    	private static final long serialVersionUID =1L;
     
    	public void paintComponent(Graphics g)
    	{	
    		// dessine une image 
    		try {
    			Image img = ImageIO.read(new File("C:/Users/François/Documents/Dossier JAVA/DossierPhotos/Dessin2.jpg"));
     
    		//pour une image de fond 
    		 g.drawImage(img, 0, 0, this.getWidth(), this.getHeight(), this); 
    		    }
    		catch (IOException e) 
    		    { e.printStackTrace();
    	        }
     
    		//Pour écrire sur la console
    	    System.out.println(" Je suis dans la class PanneauTestDeux!"); 
    	    return;
    	  } 
    }
    Tu peux bien constater " je suis dans la class PaneauTestDeux" que j'ai mis en println
    les deux autres class sont les même avec Dessin3.jpg et Dessin4.jpg.
    Ce qui veux dire pour moi qu'après ma boucle je rappelle aléatoirement mes méthodes et je ne sais pas pourquoi.
    Décidemment, je pose beaucoup de questions...
    A+

  4. #4
    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 : 55
    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
    Billets dans le blog
    2
    Par défaut
    C'est bien ce que je pensais, ces messages sont générés dans les méthodes paintComponent, servant à faire le rendu des composants. Tu ne contrôles pas du tout leur appel : c'est Swing qui le fait. Que tu fasses, repaint(), revalidate(), ou autre, Swing s'occupe de faire sa cuisine pour réagir à ces méthodes, en appelant ses propres méthodes à lui pour assurer que l'affichage soit conforme à ce qu'on attend. paintComponent() est une méthode de Swing. Même si tu redéfinis cette méthode, tu n'en décides pas de quand et par quoi ce sera appelé. Ni dans quel ordre.
    Ce qui peut intervenir sur l'ordre d'affichage de message en console, c'est aussi des messages générés sur plusieurs threads : là non plus tu ne pourras pas gérer l'ordre final d'affichage. Mais ici, tout ton code s'exécute bien sur un seul thread, l'EDT. L'ordre est juste par rapport à la cuisine interne de Swing.
    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.

  5. #5
    Membre confirmé Avatar de tarpal
    Homme Profil pro
    Ingénieur Electronique retraité
    Inscrit en
    Février 2016
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur Electronique retraité
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2016
    Messages : 70
    Par défaut
    Re tu précises :
    là non plus tu ne pourras pas gérer l'ordre final d'affichage.
    ça veux dire que je dois abandonner le projet d'afficher des images les unes après les autres dans l'ordre que je voudrais.
    C'est Swing qui fait ce qu'il a envie de faire !!!
    C'est bien décevant car c'était la base de ma programmation.
    Je suis quite pour trouver une autre solution...
    A+

  6. #6
    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 : 55
    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
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par tarpal Voir le message
    Re tu précises :

    ça veux dire que je dois abandonner le projet d'afficher des images les unes après les autres dans l'ordre que je voudrais.
    Non, non, ce n'est pas ce que j'ai dit. J'ai juste dit que tu ne pouvais pas contrôler ce que Swing faisait de ce qu'y se trouvait déjà dans l'IHM. Mais tu peux contrôler l'ordre et le moment d'ajouter quelque chose dans l'IHM. En revanche, ce n'est pas du tout comme tu le fais, et ça je t'en ai déjà parlé il me semble, de la notion d'Event Dispatch Thread. Ce que ta boucle fait, c'est ajouter 3 panneaux dans une frame, point. Il n'y a pas de notion d'ajouts successifs. L'ensemble du code du bouton est exécuté, puis l'affichage est mis à jour : les trois panneaux apparaissent en même temps (enfin, il faudrait voir le layout aussi que tu as mis, parce qu'avec le layout par défaut tu n'en verras qu'un seul, les autres devraient être cachés par celui-ci).
    Tu ne peux pas faire de toute manière ce changement dans une boucle exécutée dans l'EDT, et exécuter cette boucle dans un autre thread va t'amener tout un lot de complications sans parler de la notion de thread en elle-même. Le plus simple est d'utiliser un Timer, qui est simple à comprendre : il utilise la même notion qu'un bouton : un ActionListener. Sauf qu'au lieu de réagir sur un clic, il va réagir à intervalle régulier.

    Voici un exemple rapide :

    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
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    import java.awt.Graphics;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;
    import java.awt.image.BufferedImage;
    import java.io.File;
    import java.io.IOException;
     
    import javax.activation.MimetypesFileTypeMap;
    import javax.imageio.ImageIO;
    import javax.swing.JFileChooser;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.Timer;
     
    public class ImageDiapo extends JPanel {
     
    	private BufferedImage image; // l'image en cours à afficher dans le composant
    	private Timer timer; // un timer pour afficher successivement des images à intervalles réguliers sans bloquer l'UI
     
    	@Override
    	protected void paintComponent(Graphics g) {
    		super.paintComponent(g);
    		if (image != null) {
    			// ici je réduis mon image pour quelle s'affiche entièrement quelque soit sa taille et la taille du composant
    			double w = image.getWidth();
    			double h = image.getHeight();
    			double f;
    			if (w < h) {
    				f = getHeight()/h;
    			} else {
    				f = getWidth()/w;
    			}
    			int width = (int) (f * w);
    			int height = (int) (f * h);
    			// j'affiche l'image centrée
    			g.drawImage(image, (getWidth() - width) / 2, (getHeight() - height)/2, width, height, this);
    		}
    	}
     
    	// change l'image à afficher et repeint
    	private void setImage(BufferedImage image) {
    		this.image = image;
    		repaint();
    	}
     
    	// affecte une nouvelle liste de fichiers image à afficher
    	private void setFiles(File[] files) {
    		if (timer != null) {
    			// s'il y a un timer en cours je l'arrête
    			timer.stop();
    		}
    		if (files.length != 0) { // s'il y a des fichiers à afficher
    			ImageManager manager = new ImageManager(files); // je crée un composant qui va me permettre de boucler dessus (c'est un AttionListener)
    			timer = new Timer(1000, manager); // je créé un timer qui va appeler toutes les 1000 ms la méthode change() de mon ImageManager
    			timer.start(); // je démarre le timer
    		}
    	}
     
    	// une classe qui permet de boucler sur le tableau de fichier
    	private class ImageManager implements ActionListener {
     
    		private File[] files; // les fichiers à afficher
    		private int i; // l'index de la prochaine image à afficher
     
    		public ImageManager(File[] files) {
    			this.files = files;
    			changeImage(); // j'appelle une première fois pour afficher la première image dès le départ
    		}
     
    		@Override
    		public void actionPerformed(ActionEvent e) {
    			changeImage(); // à chaque fois, je rappelle la méthode qui change d'image
    		}
     
    		// à chaque appel, prend l'image de position i dans le tableau de fichiers, et passe à la suivante, pour le prochain appel
    		private void changeImage() {
    			try {
    				BufferedImage image = ImageIO.read(files[i]); // on charge l'image
    				setImage(image); // on la change dans le panneau
    			} catch (IOException e) {
    				setImage(null); // en cas d'erreur, on n'affiche pas d'image
    			}
    			// j'avance dans mes images et quand j'arrive à la fin, je boucle
    			i++;
    			if (i >= files.length) {
    				i = 0;
    			}
    		}
     
    	}
     
    	// programme
    	public static void main(String[] args) {
     
    		// je créé une fenêtre
    		JFrame frame = new JFrame("Démo");
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
    		// je créé une instance de mon composant et je la mets dans ma fenêtre 
    		ImageDiapo diapo = new ImageDiapo();
    		frame.getContentPane().add(diapo);
     
    		// je positionne et affiche ma fenêtre à l'écran
    		frame.setSize(300, 300);
    		frame.setLocationRelativeTo(null);
    		frame.setVisible(true);
     
    		// j'ajoute un écouteur de souris : quand on clique sur le panneau, on peut changer la liste d'images
    		diapo.addMouseListener(new MouseAdapter() {
    			@Override
    			public void mouseClicked(MouseEvent event) {
    				if (event.getClickCount() == 1 && event.getButton() == MouseEvent.BUTTON1) {
    					chooseFiles(frame, diapo);
    				}
    			}
    		});
     
    		// au démarrage je demande un dossier pour y récupérer la liste des images à afficher
    		chooseFiles(frame, diapo);
     
    	}
     
    	private static File currentDirectory;
    	private static void chooseFiles(JFrame frame, ImageDiapo diapo) {
     
    		// je créé un dialogue de choix de dossier
    		JFileChooser chooser = new JFileChooser();
    		chooser.setDialogTitle("Choisir un dossier d'image");
    		chooser.setCurrentDirectory(currentDirectory);
    		chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
     
    		if (chooser.showOpenDialog(frame) == JFileChooser.APPROVE_OPTION) {
    			// si le choix a été validé
    			File dir = chooser.getSelectedFile(); // je récupère le dossier choisi
    			if (dir.isDirectory()) {
    				currentDirectory=dir; // je le stocke pour que la prochaine ouverture du dialogue soit au même endroit
    				// je récupère tous les fichiers du dossier qui sont détectés comme étant du mimetype image
    				File[] files = dir.listFiles(f -> MimetypesFileTypeMap.getDefaultFileTypeMap()
    						.getContentType(f.getName()).startsWith("image/"));
    				// je les affectes au composant
    				diapo.setFiles(files);
    			}
    		}
    	}
     
    }
    Dans cet exemple, je ne change pas le composant comme tu le fais, je change juste l'image à l'intérieur d'un même composant. On pourait changer le composant, mais il faut penser à supprimer les autres, ou alors à veiller à ce que le layout manager soit compatibles avec la notion de composants multiples (un gridlayout par exemple, alors que le borderlayout par défaut, lui, ne l'est pas). Personnellement, je trouve moins lourd de changer l'image que le composant : éventuellement, si le but était d'afficher un diaporama de différents types de fichier, textes, images, etc... avec des composants nécessairement différents, ça serait utile, et je ferais différement.
    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.

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 28/12/2007, 23h08
  2. Réponses: 2
    Dernier message: 22/11/2007, 12h00
  3. Réponses: 4
    Dernier message: 24/06/2004, 12h13
  4. Choisir aléatoirement des noms...
    Par CritikKiller dans le forum Requêtes
    Réponses: 2
    Dernier message: 08/06/2004, 20h15
  5. [Info]descriptif des méthode ?
    Par java_math dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 01/06/2004, 08h36

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