IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

AWT/Swing Java Discussion :

Problème d'affiche d'image


Sujet :

AWT/Swing Java

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2015
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2015
    Messages : 43
    Points : 31
    Points
    31
    Par défaut Problème d'affiche d'image
    Bonjour,
    Je suis actuellement en train de coder une petite application qui propose des exercices d'anglais. Après avoir répondu dans des JtextField, une boucle vérifie les réponses et affiche une image en fonction de sa validation.
    Mais un problème surprenant intervient : il faut que je réduise la fenêtre et l'ouvre à nouveau pour que les images s'affichent...

    Je vous transmets la partie du code en question pour ne pas surcharger mon poste, mais je peux le transmettre en entier si nécessaire.

    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
    //Vérification des réponses
    		JButton btnNewButton = new JButton("Correction");
     
    		btnNewButton.addActionListener(new ActionListener() {
    			public void actionPerformed(ActionEvent arg0) {
     
    				String solutions[];
    				JLabel images[] = new JLabel[champs.length];
    				int index_img = 0;
    				boolean correct = false;
     
    				for(int i=0; i<nbr_answers; i++){ //boucle sur les champs
    					correct = false;
    					solutions = ex1.getAnswers()[i].split(";");//solutions possibles séparées par un ;
     
    					int j=0;
    					while(!correct && j<solutions.length){ //boucle sur les possibilités de réponses
    						if(champs[i].getText().equals(solutions[j])){
    							correct = true;
    						}
    						j+=1;
    					}
     
    					//ajout des images
    					if(correct){
     
    						BufferedImage myPicture=null;
    						try {
    							myPicture = ImageIO.read(new File("C:/Users/FLORIAN/workspace/english_project/images/img_valid.png"));
    						} catch (IOException e) {
    							// TODO Auto-generated catch block
    							e.printStackTrace();
    						}
    						JLabel picLabel = new JLabel(new ImageIcon(myPicture));
     
    						//position de l'image
    						int img_x = (int) champs[i].getX() + 100;
    						int img_y = (int) champs[i].getY() - 2;
    						picLabel.setBounds(img_x, img_y, 22, 22);
     
    						//ajout dans le tableau d'images
    						images[index_img] = picLabel;
    						index_img += 1;
     
    						//contentPane.add(picLabel);
     
    						System.out.println("correct");
    					}else{
     
    						BufferedImage myPicture=null;
    						try {
    							myPicture = ImageIO.read(new File("C:/Users/FLORIAN/workspace/english_project/images/img_wrong.png"));
    						} catch (IOException e) {
    							// TODO Auto-generated catch block
    							e.printStackTrace();
    						}
    						JLabel picLabel = new JLabel(new ImageIcon(myPicture));
     
    						//position de l'image
    						int img_x = champs[i].getX() + 100 ;
    						int img_y = champs[i].getY() - 2;
    						picLabel.setBounds(img_x, img_y, 22, 22);
     
    						//ajout dans le tableau d'images
    						images[index_img] = picLabel;
    						index_img += 1;
     
    						//contentPane.add(picLabel);
     
    						System.out.println("wrong");
    					}
     
    				}
     
    				//ajout des images
    				for(int i=0; i<nbr_answers; i++ ){
    					contentPane.add(images[i]);
    				}
    			}
    		});
    		btnNewButton.setBounds(296, 473, 108, 42);
    		contentPane.add(btnNewButton);
    Ce code utilise un tableau de JLabel pour mettre les images a la fin, j'avais essayé avant de les mettre une par une (dans la boucle for), mais j'obtiens le même résultat.

    Le tableau champs est un tableau de JTextField, qui contient les champs dans les quels l'utilisateur doit répondre.

    N'hésitez pas à me demander plus de précisions si nécessaire

    Merci d'avance pour votre aide !

  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 : 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
    Salut,

    Lorsqu'on ajoute un composant dans un conteneur déjà visible, il faut prévenir Swing qu'on a changé quelque chose :
    1. au niveau de l'agencement (layout) par revalidate() ;
    2. au niveau de l'affichage lui-même (rafraîchissement) par repaint()


    donc en gros :
    Code pseudojava : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    conteneur.add( nouveauComposant1 );
    conteneur.add( nouveauComposant2 );
    conteneur.add( nouveauComposant3 );
    ...
    conteneur.revalidate();
    conteneur.repaint();


    Sinon, au lieu de recréer un nouveau JLabel, tu peux aussi modifier directement son image, par JLabel.setIcon, ce qui t'évitera d'avoir à faire le revalidate() et le repaint().
    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
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Points : 7 163
    Points
    7 163
    Par défaut
    Il faut appeler la méthode revalidate pour forcer la mise à jour de l'interface.

    Mais dans la plupart des cas, c'est une mauvaise pratique de modifier l'interface graphique à la volée. Ca alourdie le code et complique la compréhension.
    Dans ton cas, tu pourrais par exemple utiliser une zone utilisée par un JPanel. Ce JPanel possède un CardLayout. Il y aura 3 composants : un JLabel avec l'image "faux", un JLabel avec l'image "vrai" et un JPanel vide.
    L'interface utilisateur est créée une fois pour toute à l'initialisation. Dans ton code, tu demandes l'affichage d'une carte dans le CardLayout et il n'y a rien d'autre à faire, tout est géré automatiquement pour l'update de l'interface.

    EDIT : trop lent
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2015
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2015
    Messages : 43
    Points : 31
    Points
    31
    Par défaut
    Merci pour votre réponse, ça fonctionne correctement !

    Oui, je me doute bien que cette façon de faire n'est pas propre...
    Mais le problème, c'est que je ne sais pas à l'avance combien de ligne il y a dans l'exercice, je ne sais donc pas par avance combien d'image je dois ajouter. C'est pourquoi le fait de cliquer sur le bouton va calculer le nombre de champs et créer autant de JLabel.

    Je viens de penser que je dois pouvoir avoir accès au nombre de lignes lorsque je cherche l'exercice et créer à ce moment là les JLabel. Mais le fait de les remplir après avoir appuyer sur le bouton va demander à nouveau le repaint nan?

    Cela dis, mon problème est résolu, merci beaucoup pour votre aide

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

Discussions similaires

  1. [ImageMagick] Affiche d'image anti-bot
    Par raptor1 dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 09/09/2006, 23h43
  2. problème pour afficher l'image recuperer d'une base
    Par vbcasimir dans le forum SGBD
    Réponses: 2
    Dernier message: 02/11/2005, 10h47
  3. Problème pour afficher une image bmp
    Par homeostasie dans le forum MFC
    Réponses: 6
    Dernier message: 08/05/2005, 19h36
  4. [MFC]Problème pour afficher une image.
    Par Deedier dans le forum MFC
    Réponses: 4
    Dernier message: 25/03/2005, 17h13
  5. Réponses: 13
    Dernier message: 23/12/2004, 19h01

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