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

  1. #1
    Membre du Club 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
    Points : 41
    Points
    41
    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
    Points : 29 131
    Points
    29 131
    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.

  3. #3
    Membre du Club 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
    Points : 41
    Points
    41
    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
    Points : 29 131
    Points
    29 131
    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.

  5. #5
    Membre du Club 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
    Points : 41
    Points
    41
    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
    Points : 29 131
    Points
    29 131
    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.

  7. #7
    Membre du Club 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
    Points : 41
    Points
    41
    Par défaut
    Ohlala...
    J'en apprends des choses...
    Je vais tout te dire de ce que voulais faire.
    Dans un premier temps,
    Je voulais dans un JPanel afficher des images les unes après les autres
    Après que mon code ait fonctionné je voulais ajouter l'instruction ( Thread.sleep(1000); ) entre chaque affichage pour avoir la séquence suivante.
    1 / j'affiche mon Dessin1 et je le laisse visible 1 seconde
    2 / j'écrase mon Dessin1 et j'affiche mon Dessin2 et je le laisse visible 1 seconde.
    3 / j'écrase mon Dessin2 et j'affiche mon Dessin3 et je le laisse toujours visible.
    Fin de ma séquence
    Je voulais aller étape par étape car l'instruction ( Thread.sleep(1000); ) me posait quelques soucis...
    Quant à ta question sur le Layout voici ma réponse :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    this.setLayout(new BorderLayout());
            //On ajoute les boutons et image dans le Layout
            this.getContentPane().add(but1,BorderLayout.NORTH);
            this.getContentPane().add(but2,BorderLayout.SOUTH);
            this.getContentPane().add(lab,BorderLayout.CENTER);
     
            this.setVisible(true);
    A l'origine j'hésitais entre 2 possibilités
    Soit utiliser une boucle for, soit utiliser un Timer.
    Je suis content d'avoir choisi la boucle for car, ce faisant, je me suis planté et j'ai découvert un peu mieux le Swing de Java.
    Je vais donc exploiter la solution Timer.
    Je ne savais pas qu'avec mon instruction je changeais mon composant. je voulais seulement changer l'image à l'intérieur de mon composant.
    Comme quoi, j'en ai des choses à apprendre...
    Je reviendrais sur le sujet un peu plus tard car je dois partir à l'étranger pour 15 jours et je n'aurais pas la possibilité de me connecter sur le forum.
    Je ne ferme pas le sujet car je reviendrais.
    Encore merci
    A+

  8. #8
    Membre du Club 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
    Points : 41
    Points
    41
    Par défaut
    Bonjour à tous
    Je reviens après une longue absence mais je n'ai pas abandonné mon sujet...
    Merci @ joel.drigo @ pour ton code.
    Comme à mon habitude j'en ai fait Deux fichiers : MainDiapo et Image Diapo.
    ça fonctionne très bien mais je suis en train d'y travailler pour :
    Premièrement => Imposer le PATH (des images) automatiquement sans avoir à ouvrir une boite de dialogue pour l'utilisateur.
    Je veux réaliser cette fonction en cliquant sur un bouton "Afficher Diapo".Je veux que ce soit transparent pour l'utilisateur.
    Deuxièmement =>Imposer l'ordre d'apparition des images. ( Actuellement elles ressortent dans l'ordre défini dans le dossier d'images )
    Je suppose que pour ce faire je devrais travailler avec un tableau.
    Comme tu vois j'ai du boulot devant moi...
    A+

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

    Tu peux obtenir le dossier utilisateur par l'appel de System.getProperty("user.home"). Ainsi, sur Windows, on peut obtenir le dossier Images par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if ( System.getProperty("os.name").startsWith("Windows") ) {
        dossierImage = Paths.get(Paths.get(System.getProperty("user.home").resolve("pictures"); // Path dossierImage
        // ou dossierImage = new File(System.getProperty("user.home"),"pictures"); // File dossierImage
    } 
    else // autre systèmes
    Pour parcourir les images dans l'ordre, effectivement on peut
    • utiliser un tableau ou une List, qui conserve l'ordre d'ajout, dont on peut faciler contrôler l'ordre, ou qu'on peut trier (Arrays.sort(tableau) ou Collections.sort(List).
    • utiliser un TreeSet, qui perrmet de définir un ensemble trié
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      TreeSet<Path> paths = new TreeSet<>(Comparator.comparing(p->p.getFileName().toString(),Collator.getInstance()));
      // ou 	TreeSet<File> files = new TreeSet<>(Comparator.comparing(File::getName,Collator.getInstance()));
    • Utilser un DirectoryStream, le transformer en Stream
      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 void showImages() throws IOException {
      		showImages(new File(System.getProperty("user.home"),"pictures"));
      	}
       
      	public void showImages(File file){
       
      		if ( file.isDirectory() ) { // si file est une dossier
      			try {
      				StreamSupport.stream( // on transforme le directoryStream en stream pour pouvoir le trier
      						Files.newDirectoryStream(file.toPath(), 
                                                      path-> { String mimetype =
      						MimetypesFileTypeMap.getDefaultFileTypeMap().getContentType(path.getFileName().toString());
      						return "image/png".equals(mimetype) || "image/jpeg".equals(mimetype);
      						} // ici par exemple, on filtre par mimetype (on prend les jpeg et les png)
      				).spliterator(),
      						false).map(Path::toFile).// on convertit Path en File
      				              sorted(Comparator.comparing(File::getName, // tri selon les noms de fichiers
      								Collator.getInstance())) // avec un collator (pour respecter les accents et la langue)
      				              .forEach(this::showImages); // on applique showImages à chaque File
      			} catch (IOException e) {
      				throw new UncheckedIOException(e);
      			}
      		}
      		else if ( file.isFile() ) {
      			showImage(file); // si file est un fichier
      		}
      		else {
      			throw new UncheckedIOException(new FileNotFoundException());
      		}
       
      	}
       
      	public void showImage(File file) {
      		// affiche l'image
      	}

  10. #10
    Membre du Club 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
    Points : 41
    Points
    41
    Par défaut
    Bonjour Joel.drigo
    Merci pour tes précieuses informations.
    Décidemment mon apprentissage est bien plus facile avec ton aide...
    Je vais de ce pas coder et coder jusqu'à obtenir ma version définitive.
    Je ne ferme pas encore le sujet, car je te rendrais compte de mes progrès.( et de mes problèmes)
    A+

    PS : Vu ton expérience je me permets de te demander un conseil:
    Pour apprendre le C++ j'avais acheté un livre.
    j'ai été très satisfait de cet investissement et je souhaite acheter le même type de livre pour apprendre Java.
    Vu la multitude des propositions sur le net, je sais que tu sauras me guider efficacement
    Merci

  11. #11
    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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Pour les bouquins je ne saurais pas trop te conseiller... j'ai appris un peu sur le tas en travaillant sur un projet avec un pote qui m'aidait et "Java pour les nuls", que j'ai lu en diagonale en 10 minutes, c'est pour dire. Sous Kawa au début en plus, à l'époque un plus qu'éditeur mais bien moins qu'IDE...souvenirs...souvenirs...
    Sinon, sur Developpez, tu trouveras 2 tutoriels en ligne très bien faits :
    1. Programmation Java pour les enfants, les parents et les grands-parents
    2. Cours de JM Doudoux

  12. #12
    Membre du Club 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
    Points : 41
    Points
    41
    Par défaut
    Bonjour,
    Merci pour les deux liens.
    C'est ce que je cherchais.
    A+

  13. #13
    Membre du Club 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
    Points : 41
    Points
    41
    Par défaut
    Bonjour @Joel.drigo
    Je suis toujours sur mon projet et j'essaye de décortiquer les codes pour les comprendre et les faire évoluer...
    Concernant l'affichage de l'image j'ai pris 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
    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);
    		}
    	}
    que j'ai modifié comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    protected void paintComponent(Graphics g) 
    	{
    		super.paintComponent(g);
    		//if (image != null) 
    		    {
    			 g.drawImage(image, 0, 0, this.getWidth(), this.getHeight(), this); 
    		    }
    	}
    Ceci m'amène deux questions:
    Dans la mesure où mon code fonctionne bien, est-ce que fais une erreur? ( il est tellement plus simple)
    D'autre part, dans la mesure où c'est moi qui maîtrise mon image et que je sais qu'elle existe bien, suis-je obligé de coder : if (image != null)
    Comme tu peux le remarquer je l'ai supprimé dans mon code définitif.
    Merci
    A+

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

    Quand je donne des exemples, j'essaye de donner des exemples qui fonctionnent quelque soit les conditions, parce que si je donnais des exemples qui ne fonctionnent que avec mes images, sur mon pc, avec mon écran, ça pourrait ne pas fonctionner proprement sur ceux qui utiliseront mon exemple dans leur environnement.

    Pour le image!=null, ce n'est pas indispensable, non, mais ça permet d'éviter les plantages inutiles. D'une part, tu as beau être sûr de maîtriser je ne sais quoi, au risque de te heurter, tu n'es ni à l'abri d'erreurs de ta part, ni d'autres erreurs indépendantes de ta volonté (fichiers corrompus, mémoire insuffisante, peu importe...). D'autre part, même si tu programmes que pour toi, et que donc tu peux être sûr de ce que tu fais à un moment et que personne d'autre n'ait besoin de le savoir, tu ne sais pas si tu reviendras pas dans 5 ans sur ton programme faire une modification qui causera une erreur que tu ne sauras corriger qu'au bout de longues heures de recherche, à moins d'avoir une excellente mémoire sur l'ensemble de ce que fait ton code. C'est comme les IOException, pourquoi les traiter, alors qu'il faut être à l'ouest pour charger un fichier qui n'existe pas ou qui est corrompu, depuis un disque qui est en panne, etc ? Et bien, parce que ça peut arriver quand même, quelque soit ce qu'on maîtrise et ce dont on serait sûr.

    Pour le reste, la différence entre ton code et le mien, c'est que tu affiches ton image de manière à ce qu'elle s'étende complètement sur la surface disponible du panel, quelque soit sa taille, y compris quand les dimensions du panel n'ont pas les mêmes proportions que l'image, ce qui causera forcément une déformation. C'est pareil que le test précédent. On peut contraindre l'image et le panel à avoir des dimensions proportionelles, et empêcher de pouvoir modifier la taille du panel, ou alors traiter le cas général et permettre d'afficher n'importe quelle image avec n'importe qu'elle taille de panel (et en particulier, quelque soit la taille de l'écran), en respectant les proportions, et en centrant l'image, juste parce que je trouve que c'est plus clean. Après, ça peut être une volonté d'afficher l'image déformée bien sûr.

    C'est comme si tu faisais un programme de calcul de moyenne des notes des éléves d'une classe et que tu me disais : "pas le peine de tester que le nombre de notes soit 0 (pour éviter la division par 0), je suis sûr que tous les éléves ont forcément tous plusieurs notes". Jusqu'au jour où ça arrive. En informatique, on traite plutôt des cas généraux, plutôt qu'une multitude de cas particuliers. Cela fait peut-être plus de boulot que de ne traiter qu'un seul cas. Ou deux. Peut-être même que trois. Mais certainement moins que de traiter 5000 cas particuliers.

    Maintenant, je comprends, tu apprends, progressivement, tu peux bien sûr te contenter de traiter le cas simple, puis de refaire la prochaine fois, et la fois suivante. Cela aura au moins le mérite de te faire t'entraîner à refaire la même chose. Mais, un jour, peut-être que tu commenceras à vouloir réutiliser ce que tu as déjà écrit pour éviter de perdre du temps à le refaire justement. Là, tu commenceras normalement à réfléchir à traiter plus généralement les cas, pour ne pas à avoir à revenir dessus à chaque fois qu'il y a un nouveau cas particulier.

  15. #15
    Membre du Club 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
    Points : 41
    Points
    41
    Par défaut
    Bonjour @joel.drigo
    Merci pour ton implication dans mon apprentissage...
    J'ai bien compris ton message. Pour le moment en tant que débutant j'essaye de simplifier un maximum, plus tard je devrais considérer le cas plus général comme tu le préconises.
    Par contre une chose dont je dois tenir compte immédiatement c'est le dimentionnement de mon image ( même si ça complique un peu mon code)
    En effet mon diapo va partir de ma première image, le reste des images ne seront que des images issues de la première ( après un certain traitement)
    Ma première image devra donc ne pas être déformée.
    Comme je connais parfaitement le format de mon image, ne puis-je pas dimentionner mon JPanel pour ne pas avoir de déformation ?
    Après plusieurs essais sans succès, J'ai essayé avec le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    // Création du conteneur JPanel
    	    JPanel pan = new JPanel();
    	    pan.setBackground(Color.ORANGE);
    	    this.setContentPane(pan);
    	    pan.setSize(80,45);
    Mais j'ai le même résultat !
    Ne peut-on pas dimentionner un JPanel ?
    Je ne sais pas faire (après plusieurs tentatives)
    A+

  16. #16
    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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    On ne peut pas dimensionner aussi facilement un panel. Le souci c'est le layouting, et l'espace disponible imposée par la frame d'abord, puis par l'écran ensuite.

    1. De base tout contenteur (un composant qui peut contenir des composants) a un layout manager qui détermine l'emplacement et la taille des composants à l'intérieur, selon certaines règles (chaque type de layout manager a ses propres règles). Le layout manager fait ses calculs et appel setSize pour donner une taille au composant. Donc tu as beau appeler setSize(), le layout manager remplacera ce que tu as mis.
    2. On peut supprimer le layout manager, ce qui fait qu'il n'y en a plus pour venir remplacer la valeur que tu affectes par setSize, mais ça peut provoquer d'autres soucis sur la présentation en général de l'application (il faudra tout gérer du coup). On peut le faire localement, on adaptant les différents layout manager, mais ça peut être un peu touchy pour obtenir au final le résultat graphique voulu
    3. Un autre moyen plus simple est de configurer le composant pour que le layout manager continue de faire ses traitements, tout en respectant certaines contraintes. Tout dépend des types de layout manager, mais on peut avec certains imposer :
      • une taille minimum (setMinimumSize())
      • une taille maximum (setMaximumSize())
      • une taille préférentielle (setPreferredSize())


      Dans une JFrame par défaut, le conteneur prévu pour les composants qu'on veut afficher dans la fenêtre s'appelle le "content pane". Le content pane est un peu comme un JPanel (pas tout à fait, mais le comportement est similaire). Et son layout manager par défaut est un BorderLayout. Un BorderLayout a 5 zones, donc une centrale, qui s'étend toujours au maximum de ce que les 4 autres permettent (en fonction de ce qu'il y a dedans, à savoir un composant par zone), la taille maximal étant contraint par le conteneur au-dessus, donc ici la fenêtre. Donc on résumé, par défaut, la taille du content pane, ou d'un composant mis dans le centre du content pane est toujours la taille de la fenêtre (intérieure, on ne compte pas les bordures et le titre de la fenêtre), quelque soit les tailles mini, maxi ou préférentielles qu'on peut imposer.


      Voici un exemple :

      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
      public class ExempleSize extends JPanel {
       
       
      	public static void main(String[] args) {
       
      		JFrame frame = new JFrame("Exemple");
      		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
       
      		JPanel mainPanel = new JPanel(); // je ne vais pas changer le content pane, mais plutôt faire mon truc à l'intérieur d'un nouveau panel (ce qui me permettra de conserver le border layout dans le content pane, pour pouvoir mettre des boutons par exemple en plus dans la fenêtre
       
      		mainPanel.setLayout(new GridBagLayout()); // j'utilsie un layout manager de type gridbaglayout
       
      		frame.add(mainPanel); // je mets le mainPanel au centre du content pane
       
       
      		// ici je fais un panel qui est censé afficher mon image, mais je vais plutôt afficher une couleur pour l'exemple
      		JPanel imagePanel = new JPanel();
      		imagePanel.setBackground(Color.RED);
       
      		// je contrains la taille du panel
      		imagePanel.setMinimumSize(new Dimension(15,20));
      		imagePanel.setPreferredSize(new Dimension(150,200));
      		imagePanel.setMaximumSize(new Dimension(150,200));
       
      		// je mets mon composant dans le mainPanel
      		mainPanel.add(imagePanel, new GridBagConstraints());
       
       
      		// ici un exemple de boutons, juste pour l'exemple
      		JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT));
      		buttonPanel.add(new JButton("Exemple 1"));
      		buttonPanel.add(new JButton("Exemple 2"));
      		frame.add(buttonPanel, BorderLayout.SOUTH); 
       
      		frame.setSize(600,400);
      		frame.setLocationRelativeTo(null);		
      		frame.setVisible(true);
       
      	}
       
       
      }
      Tu verras que si tu modifies la taille de la fenêtre, le rectangle rouge reste au centre et ne change de taille que si la fenêtre est trop petite pour la taille préférentielle
    4. Après il y a d'autres solutions, comme faire son propre layout manager, mais la plus simple à mon avis reste celle que je t'ai montrée où l'image s'adapte de manière proportionnelle centrée lors de l'affichage. On peut d'ailleurs faire évoluer le composant pour que l'adaptation soit contrainte à une sous zone du composant, et que l'image elle-même soit également contrainte à l'intérieur de cette sous zone, en x,y relatif (j'ai déjà fait ce genre de composants, qui permet par exemple d'afficher des médaillons de zoom relativement à l'image principale, tout en conservant la même adaptation relative). Pour le coup, j'avais choisi une autre solution que celle que je t'ai montrée, qui utilise des transformées affines qui ont l'avantage de simplifier beaucoup de chose, mais dont l'aspect "mathématique" peut rebuter ceux qui y sont allergiques

  17. #17
    Membre du Club 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
    Points : 41
    Points
    41
    Par défaut
    Rebonjour,
    OK j'ai bien compris l'instruction suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    imagePanel.setPreferredSize(new Dimension(x,y));
    Du coup pour résoudre mon problème, lorsque j'aurais bien défini mes tailles de fenêtre et de Panel je rajouterais l'instruction suivante dans le JFrame :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    frame.setResizable(false);
    Ainsi je n'aurais plus de problème de déformation.
    J'espère que je ne fais pas de bêtise...
    A+

  18. #18
    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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Si tu utilise setResizable(false), et si la frame à la bonne taille dès le début. effectivement il n'y aura pas de possibilité de déformation de la première image. Si toutes les autres images ont les mêmes proportions, elles ne seront pas déformées non plus.

  19. #19
    Membre du Club 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
    Points : 41
    Points
    41
    Par défaut
    Re
    C'est parfait, c'est exactement ce que je voulais.
    A+

  20. #20
    Membre du Club 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
    Points : 41
    Points
    41
    Par défaut
    Rebonjour,
    Je voudrais clore le sujet, mais je souhaite avoir mes dernières réponses.

    Première question : BufferedImage :

    J'ai deux codes qui fonctionnent tous deux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    private BufferedImage img;
    			try {
    			BufferedImage img = ImageIO.read(files ...);
    et :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    try {
    			Image img = ImageIO.read(files ...);
    Je n'ai pas compris le sens de "BufferedImage" alors que "Image" fonctionne tout aussi bien.
    Puis-je avoir l'explication d'un expert?

    Deuxième question : Timer :

    Là aussi j'ai deux codes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    private Timer chrono;	
    			chrono = new Timer(1000, manager);
    			chrono.start();
    et le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Timer chrono = new Timer(1000,this);
    Quelle est la signification du 2eme argument ? ( this, manager ...)
    je n'ai pas saisi...

    Et enfin troisième question : File :

    dans le code qui suit :
    je suppose qu'on déclare un tableau.
    Hors dans un tableau on ne peut mettre que des variables de type primitifs ( int, double,char...)
    Ici je souhaite y mettre des images.
    Pour y mettre autre chose il faut utiliser un "ArrayList".
    C'est ce que j'avais compris dans mon apprentissage.
    Où est l'erreur ?
    Et enfin dans le cadre général, quel serait le lien qui me permettrais d'avoir la doc Java?
    je sais je suis nul mais je n'ai pas trouvé quelque chose qui me convienne !!!
    Merci d'avance pour vos réponses.
    A+

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

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