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

 Java Discussion :

Afficher deux images sur le même panel, l'une après l'autre


Sujet :

Java

  1. #1
    Membre du Club
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Mai 2013
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2013
    Messages : 75
    Points : 59
    Points
    59
    Par défaut Afficher deux images sur le même panel, l'une après l'autre
    Bonjour,

    j'ai commencé Java depuis peu pour un projet et je dois créer un arbre intéractif
    (pouvoir ouvrir les images qui se trouvent dans mon ordinateur)

    Simplement lorsque j'essaie d'ouvrir une image dans une fenêtre, tout se passe bien mais quand j'essaie d'ouvrir une seconde image alors là les images clignotent l'une après l'autre.

    Je crois que j'ai mal défini mon panneau et que la première image reste enregistré mais malgré tout mes essais, rien n'y change.

    J'ai essayé d'utiliser getImage ou Icone pour changer ma méthode mais cela ne fonctionne pas dans un TreeSelectionListener.

    Voici le code qui intéresse :

    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
    public void valueChanged(TreeSelectionEvent event) {
    		    if(arbre.getLastSelectedPathComponent() != null){
     
    		    	String str=getAbsolutePath(event.getPath()).toString();
    		    	Image img=null;
    				 Panneau pan=null;  
     
    				 	fenetre2.setTitle("Ma première fenêtre Java");
    				    fenetre2.setSize(600, 600);
    				    fenetre2.setLocationRelativeTo(null);
     
    				    getImage() 
     
    				    try {
    				    img = ImageIO.read(new File(getAbsolutePath(event.getPath()).toString()));
    				    }catch (IOException e) {
    				        e.printStackTrace();
    				      }
     
     
    		pan= new Panneau(img);
     
    		    fenetre2.getContentPane().add(pan);
    		    fenetre2.setVisible(true);
     
    		    }
    		  }
    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
    public class Panneau extends JPanel { 
     
    public Image img;
     
     
    public Panneau(Image str) {
     
    	this.img=str;
     
    	}
     
    public void paintComponent(Graphics g){
     
    	super.paintComponent(g); 
     
            g.drawImage(img, 0, 0, this);
            repaint();
     
      }               
    }
    Merci à ceux qui prendront du temps pour se pencher sur mon problème,

    Cordialement,

    Ronan

  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,

    tout d'abord, tu ne dois pas appeler repaint() dans la méthode paint() : la méthode repaint() demande de redessiner le composant, donc d'appeler la méthode paint(), donc de redessiner, donc d'appeler la méthode paint... etc... tu redessine constamment (si tu regardes l'activité de ton cpu, tu vas voir que ça carbure).

    Ensuite, quand tu fais fenetre2.getContentPane().add(pan);, tu ajoutes ton nouveau Panneau dans ta fenêtre, et il se superpose à celui que tu avais ajouté pour l'image précédente.

    Tu te retrouves donc avec 2 JPanel au même endroit qui se redessine continuellement d’où un effet de clignotement des deux.

    Visiblement, tu veux afficher chaque nouvelle image dans une et même fenêtre : dans ce cas, tu peux simplement ajouter ton Panneau dans la fenêtre, au moment de sa création, conserver une référence dessus (en plus de celle que tu gardes sur la fenêtre fenetre2), et faire une méthode setImage(Image image) dans Panneau :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public void setImage(Image nouvelleImage) {
       img=nouvelleImage;
       repaint(); // la il faut faire repaint() pour que paint() soit appelé et voir la nouvelle image
    }
    que tu appelles dans

    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
    public void valueChanged(TreeSelectionEvent event) {
    if(arbre.getLastSelectedPathComponent() != null){
     
    String str=getAbsolutePath(event.getPath()).toString();
    Image img=null;
     
    fenetre2.setTitle("Ma première fenêtre Java");
    fenetre2.setSize(600, 600);
    fenetre2.setLocationRelativeTo(null);
     
    //getImage() // a quoi ça sert ?
     
    try {
    img = ImageIO.read(new File(getAbsolutePath(event.getPath()).toString()));
    }catch (IOException e) {
    e.printStackTrace();
    }
     
     
    //pan= new Panneau(img); // à créer au moment ou tu crées ta fenetrer2, et à ajouter au contentPane à ce moment la
     
    //fenetre2.getContentPane().add(pan);
    //fenetre2.setVisible(true);
     
    pan.setImage(img);  // change l'image affichée dans le Panneau
     
     
    }
    }

    PS. Penses à mettre ton code entre balises code, s'il te plait.

  3. #3
    Membre du Club
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Mai 2013
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2013
    Messages : 75
    Points : 59
    Points
    59
    Par défaut
    Merci pour ta réponse mais il y a encore un petit problème :

    Tout d'abord j'ai laissé fenetre2.SetVisible à l'intérieur de ValueChanged sinon j'ai une fenêtre 2 qui s'affiche dès le début d'execution de mon code.

    De plus si je n'initialise pas "pan" dans le méthode "ValueChanged" Java me demande de créer pan comme une variable "final" (alors que fenetre2.SetVisible fonctionne très bien ??) : j'ai accepté de définir pan comme final et maintenant il n'affiche plus de photo du tout quand je clique sur mon arbre (mais il y a bien une fenêtre 2 qui s'ouvre)


    Un peu plus de code pour vous éclairer peut être :

    Classe fenêtre {

    Définition de boutons, fenetre1, pan et fenêtre 2


    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
    	arbre.addTreeSelectionListener(new TreeSelectionListener(){
    		  public void valueChanged(TreeSelectionEvent event) {
    		    if(arbre.getLastSelectedPathComponent() != null){
     
     
    		    	String str=getAbsolutePath(event.getPath()).toString();
    		    	Image img=null;
     
    				    try {
    				    img = ImageIO.read(new File(getAbsolutePath(event.getPath()).toString()));
    				    }catch (IOException e) {
    				        e.printStackTrace();
    				      }
     
     
    				    panneau.setImage(img);
    fenetre2.setVisible(true);
    		    }
    		  }
     
    		  private String getAbsolutePath(TreePath treePath){
    		    String str = "";
    		    //On balaie le contenu de l'objet TreePath
    		    for(Object name : treePath.getPath()){
    		      //Si l'objet a un nom, on l'ajoute au chemin
    		      if(name.toString() != null)
    		        str += name.toString();
    		    }
     
    		    return str;  
    		  }
    		});
    }

    Et ensuite tout les listener des boutons, la méthode de création d'arbre et la méthode setImage que vous m'avez envoyé.

    D'avance merci

    Ronan Sy

  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
    Citation Envoyé par Ronan_ Voir le message
    Merci pour ta réponse mais il y a encore un petit problème :


    si je initialise pas "pan" dans le méthode "ValueChanged" Java me demande de créer pan comme une variable "final" : j'ai essayé de le faire et maintenant il n'affiche plus de photo du tout quand je clique sur mon arbre (mais il y a bien une fenêtre 2 qui s'ouvre)
    Tu dois bien entendu ajouter le panneau à ta fenêtre2, exactement comme tu le faisais quand tu le créais à chaque fois dans valueChanged(..), sinon il ne s'affichera pas forcément.

    Citation Envoyé par Ronan_ Voir le message
    en fait je ne vois pas comment "conserver de reference" sur mon pan qui est initier dans le main, et envoyer cette reférence dans
    Exactement comme ta variable fenetre2 : elle est déclarée ou ta variable fenetre2 ?

  5. #5
    Membre du Club
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Mai 2013
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2013
    Messages : 75
    Points : 59
    Points
    59
    Par défaut
    Comme ceci :

    Je vous remet le code exact de la construction de l'arbre

    J'ai défini la fenêtre2, le panneau et j'ai ajouté le panneau à la fenêtre avant d'appelé la fonction


    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
    final JTree arbre = buildTree();
     
    	fenetre2.setTitle("Ma première fenêtre Java");
        fenetre2.setSize(600, 600);
        fenetre2.setLocationRelativeTo(null);
        Panneau panneau= new Panneau();
    	fenetre2.getContentPane().add(panneau);
     
    	arbre.addTreeSelectionListener(new TreeSelectionListener(){
    		  public void valueChanged(TreeSelectionEvent event) {
    		    if(arbre.getLastSelectedPathComponent() != null){
    		      //La méthode getPath retourne un objet TreePath
     
    		    	//String str=getAbsolutePath(event.getPath()).toString();
    		    	Image img=null;
     
     
     
     
     
    				    try {
    				    img = ImageIO.read(new File(getAbsolutePath(event.getPath()).toString()));
    				    }catch (IOException e) {
    				        e.printStackTrace();
    				      }
     
     
     
    				    panneau.setImage(img);
    				    fenetre2.setVisible(true);
    		    }
    		  }
     
    		  private String getAbsolutePath(TreePath treePath){
    		    String str = "";
    		    //On balaie le contenu de l'objet TreePath
    		    for(Object name : treePath.getPath()){
    		      //Si l'objet a un nom, on l'ajoute au chemin
    		      if(name.toString() != null)
    		        str += name.toString();
    		    }
     
    		    return str;  
    		  }
    		});
     
    	pan3.add(new JScrollPane(arbre),BorderLayout.CENTER);

  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
    On ne voit pas dans ce code ou tu déclares ta variable fenetre2.

    Tu as peut être dans ta classe un déclaration statique (si l'extrait de ton code est dans la méthode main(), je suppose que c'est que tu as fait).
    De la même manière, déclares ta variable panneau.

    Dans le code que tu viens de poster, tu peux aussi la déclarer final pour qu'elle soit accessible dans la méthode valueChanged() de ton TreeSelectionListener

  7. #7
    Membre du Club
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Mai 2013
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2013
    Messages : 75
    Points : 59
    Points
    59
    Par défaut
    En effet, désolé pour les imprécisions.

    J'ai donc défini mon Panneau en statique.

    Et toujours pas d'image qui s'affiche.

    J'ai essayé de changer la position de add(panneau) mais rien n'y fait...


    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
    public Fenetre(){
        this.setTitle("LOGICIEL");
        this.setPreferredSize(new Dimension(600, 400));
        this.setLocationRelativeTo(null);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);             
     
    	pane1.setBackground(Color.white);
        pane1.setLayout(new BorderLayout());
        pane1.setSize(800,800);
     
        pan2.setPreferredSize(new Dimension(100, 50));
        pan2.add(button1);
        pan2.add(bouton2);
     
    	button1.addActionListener(this);
    	bouton2.addActionListener(this);
     
    	pane1.add(pan2, BorderLayout.SOUTH);
     
    	final JTree arbre = buildTree();
     
    	fenetre2.setTitle("Ma première fenêtre Java");
        fenetre2.setSize(600, 600);
        fenetre2.setLocationRelativeTo(null);
    	fenetre2.getContentPane().add(panneau);
     
    	arbre.addTreeSelectionListener(new TreeSelectionListener(){
    		  public void valueChanged(TreeSelectionEvent event) {
    		    if(arbre.getLastSelectedPathComponent() != null){
     
    		    	Image img=null;
     
    				    try {
    				    img = ImageIO.read(new File(getAbsolutePath(event.getPath()).toString()));
    				    }catch (IOException e) {
    				        e.printStackTrace();
    				      }
     
    				    panneau.setImage(img);	    
    				    fenetre2.setVisible(true);
    		    }
    		  }
     
     
    		  private String getAbsolutePath(TreePath treePath){
    		    String str = "";
    		    //On balaie le contenu de l'objet TreePath
    		    for(Object name : treePath.getPath()){
    		      //Si l'objet a un nom, on l'ajoute au chemin
    		      if(name.toString() != null)
    		        str += name.toString();
    		    }
     
    		    return str;  
    		  }
    		});
     
    	pan3.add(new JScrollPane(arbre),BorderLayout.CENTER);
     
     
     
     
    	pan3.setPreferredSize(new Dimension(200, 400));
    	pane1.add(pan3, BorderLayout.WEST);
     
        getContentPane().add(pane1);
        pack();
        setVisible(true);
     
     
    	}

    ET ma classe Panneau



    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
    public class Panneau extends JPanel { 
     
    public Image img;
     
     
    public Panneau(Image str) {
     
    	this.img=str;
     
    	}
     
    public Panneau() {
    	this.img=null;
    }
     
    public void paintComponent(Graphics g){
     
    	super.paintComponent(g); 
     
            g.drawImage(img, 0, 0, this);
      }  
     
    public void setImage(Image nouvelleImage) {
    	   Image img=nouvelleImage;
    	   repaint(); // la il faut faire repaint() pour que paint() soit appelé et voir la nouvelle image
    	}
     
    }

  8. #8
    Membre du Club
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Mai 2013
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2013
    Messages : 75
    Points : 59
    Points
    59
    Par défaut
    c'est bon!

    Dans la fonction setImage il faut mettre

    this.img=nouvelleImage; car je l'ai défini dans Panneau

    Merci beaucoup pour votre aide, ça marche très bien

  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
    Citation Envoyé par Ronan_ Voir le message
    c'est bon!

    Dans la fonction setImage il faut mettre

    this.img=nouvelleImage; car je l'ai défini dans Panneau

    Merci beaucoup pour votre aide, ça marche très bien
    J'allais le dire

    Ouf

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

Discussions similaires

  1. Afficher une image sur la même page en cliquant sur un lien
    Par phenix1988 dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 31/10/2019, 20h20
  2. Afficher deux légendes sur un même axe
    Par samuela dans le forum Interfaces Graphiques
    Réponses: 1
    Dernier message: 22/07/2014, 20h47
  3. Deux images sur une même ligne
    Par ahmedpa dans le forum Balisage (X)HTML et validation W3C
    Réponses: 8
    Dernier message: 13/07/2012, 11h25
  4. Afficher plusieurs rectangles sur la même image
    Par hello05 dans le forum Images
    Réponses: 5
    Dernier message: 15/04/2008, 13h48
  5. [MySQL] afficher le résultat de deux tables sur un même tableau
    Par gpsevasion dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 03/10/2007, 10h38

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