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 :

Comment insérer une image au cours d'une application


Sujet :

AWT/Swing Java

  1. #1
    Invité
    Invité(e)
    Par défaut Comment insérer une image au cours d'une application
    Bonsoir,

    J'arrive à bouger une image mais je ne sais pas comment ajouter une image à mon panel sur le clic d'un bouton.

    Pour le moment, j'ai mon panel avec un fond et mon coureur mais par la suite sur l'événment clic bouton, je souhaite insérer des images sur mon image principale.

    J'ai recherché dans les tutoriels mais sans trop de succès.

    Avez-vous une idée ?

    Merci

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    572
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Février 2007
    Messages : 572
    Points : 675
    Points
    675
    Par défaut
    Il y a pourtant du code a profusion sur le sujet.

    Tu peux chercher avec les mots cles du genre background Image JPanel game 2D, tu trouveras tout ce qu'il faut.

  3. #3
    Invité
    Invité(e)
    Par défaut
    Merci, je vais refaire une recherche.

    Pour les mots clés : background Image JPanel, j'ai déjà essayé et je retrouve le code dont je me suis servis pour afficher mon image de fond à la création de mon JPanel.

    en revanche, j'ai pas encore trouvé le moyen d'ajouter des images en cours d'application.

    Je retourne à mes recherches.

  4. #4
    Invité
    Invité(e)
    Par défaut
    Je reprendrai les recherches demain mais j'ai vu pas mal de post et toujours pas ce qu'il me faut.

  5. #5
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Il faudrai egalement detailler plus precisement ce qui te pose probleme et comment tu envisages ton affichage et ce que tu veux faire exactement.

    Est-ce le listener du bouton ? L'usage de JFileChooser (si tu charges tes images de cette maniere) ? L'usage d'ImageIO (idem) ? La composition d'images entre elles (quel rapport avec le JPanel alors ?) ? L'affichage d'image a l'ecran ? ... ta question est vague, tres vague.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  6. #6
    Invité
    Invité(e)
    Par défaut
    Merci pour ta réponse Bouye.

    J'affiche dans un JPanel une image de fond avec ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Toolkit kit = Toolkit.getDefaultToolkit();    
    course= kit.getImage("cour.jpg");
     
     public void paintComponent(Graphics comp) {
        Graphics2D comp2D = (Graphics2D) comp;
              if (yPosition == -1)
           yPosition = height - 20;
         if (fcourse != null)  {
          comp2D.drawImage(course, 0, 0, this);
              }
     
           }
    Dans mon application, j'ai ajouté un bouton. J'aimerais trouver le moyen qu'à chaque clic sur le bouton, une image d'un coureur s'affiche sur mon image de fond.

    J'espère que çà pourra t'aider.

    Merci

  7. #7
    Invité
    Invité(e)
    Par défaut
    J'ai réussi à faire apapraitre un coureur mais je ne sais pas si ma solution est bonne.

    J'ai ajouté un switch dans paintComponent avec cas 1 = image de fond et cas 2 = image de fond + coureur.

    Pouvez-vous me dire si ce n'est pas tiré par les cheveux ?

    Merci

  8. #8
    Membre actif Avatar de Lethal
    Profil pro
    Développeur Java
    Inscrit en
    Février 2006
    Messages
    194
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Février 2006
    Messages : 194
    Points : 227
    Points
    227
    Par défaut
    Et si tu fais un vecteur d'images et que paint s'occupe simplement de parcourir le vecteur et d'afficher les images. La gestion du vecteur d'image se ferait a un endroit plus judicieux.

  9. #9
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Lethal
    Et si tu fais un vecteur d'images et que paint s'occupe simplement de parcourir le vecteur et d'afficher les images. La gestion du vecteur d'image se ferait a un endroit plus judicieux.
    Le problème est que je débute dans l'animation 2D et que je ne connais rien aux vecteurs d'images.

  10. #10
    Membre actif Avatar de Lethal
    Profil pro
    Développeur Java
    Inscrit en
    Février 2006
    Messages
    194
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Février 2006
    Messages : 194
    Points : 227
    Points
    227
    Par défaut
    Lol.

    Je voulais s'implement dire un tableau avec des images dedans. Comme ca la méthode paintComponent s'occupe uniquement d'afficher toutes les images contenues dans le tableau. Comme ca tu peux mettre les images dans le tableau dans une autre partie du programme qui sera plus voué à la gestion.

  11. #11
    Invité
    Invité(e)
    Par défaut
    Je dois déclarer un tableau dans lequel je mets mes images.

    Ensuite, dans paintcomponent au lieu de mettre comp2D.drawImage(fond, 0, 0, this), je mets comp2D.drawImage(tableauimg[0], 0, 0, this) ?

    Je ne vois pas trop si c'est çà.

    Avec ma solution, j'ai de toute façon un problème. En effet, une fois le coureur sortit de la fenetre, je ne peux pas en recréer un.

  12. #12
    Invité
    Invité(e)
    Par défaut
    J'ai cherché durant l'après-midi mais je n'ai pas réussi à savoir si ma solution est bonne.

    De plus, je n'arrive pas à faire apparaitre un nouveau courreur quand le premier est sorti de l'écran.

    Pouvez-vous m'aider s'il vous plaît ?

    Merci

  13. #13
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    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
     
    BufferedImage runner;
    java.util.List<Point> locationList = new LinkedList<Point>();
     
    runner = ImageIO.read("cour.jpg");
     
    [...]
     
    button.addActionListener(new ActionListener() {
      /** {@inheritDoc}
      */
      public void actionPerformed(ActionEvent event) {
         addNewRunner();
      }
    });
     
    /** Adds a new runner at random location.
     */
    private void addNewRunner() {
      int width = Math.max(0, getWidth()  - runner.getWidth());
      int height = Math.max(0, getHeight()  - runner.getHeight());
      int x = (int)(Math.random()*width);
      int y = (int)(Math.random()*height);
      locationList.add(new Point(x, y));
      repaint();
    }
     
     
    /** {@inheritDoc}
     */
    @Override protected void paintComponent(Graphics comp) {
        Graphics2D comp2D = (Graphics2D) comp;
         for (Point point : pointList) {
             comp2D.drawImage(runner, point.x, point.y, null);
         }
    }
    Qq suggestions :
    - ne pas charger les image avec Toolkit (sauf si tu ne peux pas faire autrement), ce chargement est asynchrone et non seulement l'image peut ne pas etre completement chargee quand le programme commence mais, de plus, quand le chemin de l'image n'est pas correct l'image n'est pas chargee et il n'y a pas d'erreur (d'ou beaucoup de questions de debutants du style "pourquoi mon image ne s'affiche pas ?").

    - quand l'image est deja chargee de maniere synchrone (via ImageIO ou ImageIcon), mieux vaut passer null plutot que this en parametre de drawImage(), ca evite de ralentir les choses pour rien.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  14. #14
    Invité
    Invité(e)
    Par défaut
    Je te remercie pour ton aide.

    Peux-tu m'éclairer sur ton code ?

    1)
    ne pas charger les images avec Toolkit
    Je comprends pourquoi mais par quoi je dois remplacer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Toolkit kit = Toolkit.getDefaultToolkit();    
    course= kit.getImage("cour.jpg"); // Fond du JPanel
    Par çà ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    BufferedImage fond;  
    fond = ImageIO.read("fond.jpg");

    2) Mon idée d'utiliser un switch dans paintComponent n'est pas une bonne idée ?

    3) J'ai du mal à comprendre ton code.

    La partie :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    BufferedImage runner;
    java.util.List<Point> locationList = new LinkedList<Point>();
    runner = ImageIO.read("cour.jpg");
    Tu crées une liste d'objet Point et cour.jpg c'est le fond du JPanel donc je pense qu'il faut que je le renomme en fond cela évitera les malentendu ?

    La partie :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    /** Adds a new runner at random location.
     */
    private void addNewRunner() {
      int width = Math.max(0, getWidth()  - runner.getWidth());
      int height = Math.max(0, getHeight()  - runner.getHeight());
      int x = (int)(Math.random()*width);
      int y = (int)(Math.random()*height);
      locationList.add(new Point(x, y));
      repaint();
    }
    Si je comprends çà ajoute un Point dont les coordonnées sont aléatoirement définies dans la lsite. Mes coureurs vont être placés sur une ligne de départ. J'aurais donc des coordonnées fixes.

    La partie :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    /** {@inheritDoc}
     */
    @Override protected void paintComponent(Graphics comp) {
        Graphics2D comp2D = (Graphics2D) comp;
         for (Point point : pointList) {
             comp2D.drawImage(runner, point.x, point.y, null);
         }
    }
    Dans la méthode paintComponent, je dois bien sûr ajouter mon fond.
    Sera-t-il encore possible de modifier la position de mes coureurs puisque les coordonnées sont représentés par point.x, point.y et non pas x, x1, x2 et y, y1, y2 par exemple?

    Je te remercie énormémement de m'apporter ton aide.
    Dernière modification par Invité ; 01/06/2007 à 00h32.

  15. #15
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    1) Toolkit charge l'image de maniere asynchrone, ce qui veut dire :
    - la methode retourne immediatement une image vide
    - cette image vide est remplie dans une autre thread.
    - tu n'es pas prevenu en cas d'erreur sauf si tu as passe un ImageObserver a la methode.

    ImageIO et ImageIcon chargent l'image de maniere synchrone, ce qui veut dire :
    - ces methodes bloquent tant que l'image n'est pas completement chargee.
    - des exceptions et erreurs sont levees en cas de probleme, ce qui permet de les detecter bien plus facilement.

    2) Pourquoi pas ? j'ignore ce que tu veux faire exactement.

    3) Car l'image du coureur n'est pas importante en soit (en fait il peuvent tous utiliser la meme image ou des variations de la meme image (pattern du poids mouche/fly weight), seule leur position est importante (pour ce que je comprend de ton probleme actuellement avec les rares infos a ma disposition).

    J'ajoute les courreurs a des positions aleatoire car je ne sais pas ou les mettres et pour monter un exemple. Toi tu connais l'orientation et la location de ta ligne de depart tu peux donc les ajouter aux positions correctes.
    Ensuite tu parcoures ta liste de points et tu affiche l'image ou les images appropriees aux locations appropriees. En cas de deplacement du coureur ce n'est pas l'image qui se deplace mais sa location (il faut modifier le points). Dans le cas d'un programme plus complexe (jeu par exemple) tu te creera une entite Courreur qui contiendra sa location, son etat, une reference sur son image, etc... et toute autre information pertinante et tu manipuleras une liste de Courreur.

    Comme je te l'ai dit si tu ne donnes assez d'informations, on ne peut pas t'aider completement dans ton probleme. J'ai tout simplement suppose que l'image fond (qui s'appelle course dans ton code) etait le sprite du courreur alors qu'en fait c'est le champs de course a toi donc de faire les corrections necessaires. C'est un exemple pour te montrer une maniere de proceder.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  16. #16
    Invité
    Invité(e)
    Par défaut
    Merci pour ces explications.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    BufferedImage fond;  
    fond = ImageIO.read("fond.jpg");
    J'ai essayé mais j'ai le message "cannot find symbol : method read(java.lang.String).

    En mettant,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fond = ImageIO.read(getClass().getResource("fond.jpg"));
    ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    File file = new File("fond.jpg");
    fond = ImageIO.read(file);
    çà à l'air de marcher mais je ne sais pas pourquoi.

    En fait, pour mon programme, au lancement j'affiche mon fond dans le JPanel.
    Ensuite, sur un clic bouton1, j'ajoute un courreur.
    Ensuite, sur un clic bouton2, je fait avancer mon coureur.
    Ensuite, quand le coureur disparait de mon fond (je ne pense pas qu'on puisse le l'effacer), sur un clic bouton1, j'ajoute un nouveau courreur.

    Merci pour l'aide que tu m'apportes.

  17. #17
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Oui car j'ai ecrit ca de memoire et il n'y a pas de methode qui prend une String en argument. Tu as correctement corrige le probleme.

    Avec cette methode de composition, ton courreur n'est pas directement incruste dans l'image du fond, il est juste affiche/compose par dessus a l'ecran. Donc quand il sort de l'ecran, le fond sera de nouveau affiche vierge. Par contre il faut a ce moment probablement detecter que le courreur n'a plus besoin d'avancer et le retirer des sprites a animer.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

Discussions similaires

  1. [Python 3.X] Créer une image png à partir d'une image de format quelconque avec Python
    Par bguy4 dans le forum Général Python
    Réponses: 3
    Dernier message: 30/10/2014, 10h49
  2. Réponses: 3
    Dernier message: 10/10/2013, 11h11
  3. Afficher une image par défaut lorsque une image ne s'affiche pas
    Par ne2sbeal dans le forum Général Conception Web
    Réponses: 4
    Dernier message: 10/10/2011, 10h42
  4. Comment insérer des images dans une ComboBox HTML ?
    Par UiYuki dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 29/08/2010, 15h35
  5. Réponses: 4
    Dernier message: 08/03/2009, 13h13

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