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

Interfaces Graphiques en Java Discussion :

Refresh image dans un JPanel


Sujet :

Interfaces Graphiques en Java

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2008
    Messages : 33
    Par défaut Refresh image dans un JPanel
    Bonjour à tous, bon ca fait déjà un bout de temps que je galère pour trouver la solution donc je m'en remet au savoir de ce forum

    Donc voilà je m'explique sur mon problème.

    J'ai une fenetre avec 2 JPanel dedans, un JPanel qui contient des boutons et un autre qui contient un JScrollPane qui contient un JLabel dans lequel j'ai une image.

    Afficher l'image dès le début a pas été un problème. Mon soucis en fait c'est que je ne veux pas que mon image s'affiche dès le début mais qu'elle s'affiche qu'après que j'ai cliqué sur mon bouton. Autre précision, mon image se crée quand je clique sur le bouton. Dans le code ci-dessous, j'ai fait comme ci elle existait déjà mais en fait elle se crée qu'après traitement quand je clique sur mon bouton.

    Voici mon code source :

    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
    import javax.swing.*;
     
    import java.awt.*;
     
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.util.*;
    import java.io.*;
    import java.awt.image.BufferedImage;
     
     
    public class Fenetre extends JFrame {
     
         JLayeredPane lp; 
         JPanel graph, boutons;
     
        public Fenetre() {
            super();
     
            setTitle("Définition des tâches");
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            Toolkit k = Toolkit.getDefaultToolkit();
     
       	Dimension tailleEcran = k.getScreenSize();
     
       	int largeurEcran = tailleEcran.width;
     
       	int hauteurEcran = tailleEcran.height;
     
    	lp=new JLayeredPane();        
            lp.setPreferredSize(new Dimension(largeurEcran,hauteurEcran));
     
            graph = new JPanel();
            boutons = new JPanel();
     
            JLabel image_graph = new JLabel(new ImageIcon("test.gif"));  // Je met l'image ici mais j'aimerais la faire afficher après le click sur mon bouton
     
            JScrollPane pictureScrollPane = new JScrollPane(image_graph);
            pictureScrollPane.setPreferredSize(new Dimension(largeurEcran-10, 3*(hauteurEcran/4)-150));
            graph.add(pictureScrollPane); 
            boutons.add(new JButton(new FONCTION()));
     
            // On définit la taille de chaque JPanel dans la fenetre
    	graph.setBounds(0,(hauteurEcran/4)+50,largeurEcran,3*(hauteurEcran/4)-90);
    	boutons.setBounds(0,hauteurEcran/4,largeurEcran,50);
     
    	// On rajoute tous les JPanel au JLayeredPane
    	lp.add(boutons);
    	lp.add(graph);
    	getContentPane().add(lp); 
     
            pack();
        }
     
        private class FONCTION extends AbstractAction {
     
            private FONCTION() {
                super("Afficher image");
            }
     
            public void actionPerformed(ActionEvent e) {
     
           	}
        }
     
        public static void main(String[] args) {
    	Toolkit k = Toolkit.getDefaultToolkit();
     
       	Dimension tailleEcran = k.getScreenSize();
     
       	int largeurEcran = tailleEcran.width;
     
       	int hauteurEcran = tailleEcran.height;
     
     
     
    	JFrame frame = new Fenetre();
     
    	frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
    	frame.setSize(largeurEcran,hauteurEcran);
     
    	frame.setLocation(0,0);
     
    	frame.setVisible(true);
    	frame.setExtendedState(Frame.MAXIMIZED_BOTH);
        }
     
        // main et autres fonctions
    }
    C'est un peu à l'arrache, si vous avez des conseils je suis preneur.

    Merci d'avance.

  2. #2
    Membre éprouvé Avatar de anisj1m
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2006
    Messages
    1 067
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 067
    Par défaut
    penser a la méthode repaint()

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2008
    Messages : 33
    Par défaut
    Rien ne se passe..

    Je remet la nouvelle version de mon code qui m'affiche maintenant mon image après que j'ai appuyé sur mon bouton.

    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
    import javax.swing.*;
     
    import java.awt.*;
     
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.util.*;
    import java.io.*;
    import java.awt.image.BufferedImage;
     
     
    public class Fenetre extends JFrame {
     
         JLayeredPane lp; 
         JPanel graph, boutons;
         JScrollPane pictureScrollPane;
         Toolkit k = Toolkit.getDefaultToolkit();
     
         Dimension tailleEcran = k.getScreenSize();
     
         int largeurEcran = tailleEcran.width;
     
         int hauteurEcran = tailleEcran.height;
     
        public Fenetre() {
            super();
     
            setTitle("Définition des tâches");
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
    	lp=new JLayeredPane();        
            lp.setPreferredSize(new Dimension(largeurEcran,hauteurEcran));
     
            boutons = new JPanel();
            boutons.add(new JButton(new FONCTION()));
    	boutons.setBounds(0,hauteurEcran/4,largeurEcran,50);
     
    	lp.add(boutons);
    	getContentPane().add(lp); 
     
            pack();
        }
     
        public void repaint(){
        	super.repaint();
        	for(int i=0;i<this.countComponents();i++){
        		this.getComponent(i).repaint();
        	}
        }
     
        private class FONCTION extends AbstractAction {
     
            private FONCTION() {
                super("Afficher image");
            }
     
            public void actionPerformed(ActionEvent e) {
     
                   //création de mon image "test.gif"
     
           	 	pictureScrollPane = new JScrollPane(new JLabel(new ImageIcon("test.gif")));
            	pictureScrollPane.setPreferredSize(new Dimension(largeurEcran-10, 3*(hauteurEcran/4)-150));
            	graph = new JPanel();
    	        graph.add(pictureScrollPane); 
    	        graph.setBounds(0,(hauteurEcran/4)+50,largeurEcran,3*(hauteurEcran/4)-90);
    	        lp.add(graph);
    	        getContentPane().add(lp); 
     
           	}
        }
     
        public static void main(String[] args) {
    	Toolkit k = Toolkit.getDefaultToolkit();
     
       	Dimension tailleEcran = k.getScreenSize();
     
       	int largeurEcran = tailleEcran.width;
     
       	int hauteurEcran = tailleEcran.height;
     
     
     
    	JFrame frame = new Fenetre();
     
    	frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
    	frame.setSize(largeurEcran,hauteurEcran);
     
    	frame.setLocation(0,0);
     
    	frame.setVisible(true);
    	frame.setExtendedState(Frame.MAXIMIZED_BOTH);
        }
     
        // autres fonctions
    }
    Le truc c'est que j'aimerais que quand je reclique sur mon bouton il m'affiche ma nouvelle image qui a été crée. Et la fonction repaint a pas l'air d'y changer grand chose

    Une idée ?

  4. #4
    Membre chevronné Avatar de ngpub
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    449
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 449
    Par défaut
    C'est un peu à l'arrache
    Effectivement, perso j'ai même pas compris où est le problème.

    Donc pour simplifier :
    - tu as des boutons et un composant qui affiche une image.
    - à l'initialisation le "composant-image" est vide.
    - un des boutons initialise et affiche une image.
    - si on réutilise ce même bouton, il initialise et affiche une nouvelle image.

    Et alors qu'est-ce qui ne fonctionne pas ?

    si vous avez des conseils je suis preneur
    - un JLayeredPane est-ce bien raisonnable ?
    - "setBounds(0,hauteurEcran/4,largeurEcran,50)", "setBounds(0,(hauteurEcran/4)+50,largeurEcran,3*(hauteurEcran/4)-90)", ..., laisse donc faire les LayoutManagers, ils sont là pour ça.
    - "FONCTION", en java la politesse veut que l'on préfère écrire "Fonction".
    - pour la fonction repaint(), oublie c'est pas comme ça qu'on l'utilise et pour l'instant, j'en vois pas l'utilité dans ton code.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2008
    Messages : 33
    Par défaut
    Donc pour simplifier :
    - tu as des boutons et un composant qui affiche une image.
    - à l'initialisation le "composant-image" est vide.
    - un des boutons initialise et affiche une image.
    - si on réutilise ce même bouton, il initialise et affiche une nouvelle image.

    Et alors qu'est-ce qui ne fonctionne pas ?
    Ben mon image s'affiche la première fois mais l'image ne s'actualise pas quand je re-clique sur mon bouton.

    - un JLayeredPane est-ce bien raisonnable ?
    - "setBounds(0,hauteurEcran/4,largeurEcran,50)", "setBounds(0,(hauteurEcran/4)+50,largeurEcran,3*(hauteurEcran/4)-90)", ..., laisse donc faire les LayoutManagers, ils sont là pour ça.
    Disons que je n'ai pas vu qu'est-ce qui pourrait satisfaire ce que je veux un JPanel qui occupe la première moitié de mon écran en haut, une ligne de bouton au milieu qui fait juste office de séparateur et un autre JPanel contenant mon image dans la deuxième moitié en bas qui ne s'affichera qu'au premier click sur le bouton.

  6. #6
    Membre Expert Avatar de Ivelios
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juillet 2008
    Messages
    1 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 031
    Par défaut
    Disons que je n'ai pas vu qu'est-ce qui pourrait satisfaire ce que je veux un JPanel qui occupe la première moitié de mon écran en haut, une ligne de bouton au milieu qui fait juste office de séparateur et un autre JPanel contenant mon image dans la deuxième moitié en bas qui ne s'affichera qu'au premier click sur le bouton.
    GridBagLayout

    Mais cela ne résout pas le problème

  7. #7
    Membre chevronné Avatar de ngpub
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    449
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 449
    Par défaut
    l'image ne s'actualise pas quand je re-clique sur mon bouton.
    Mais tu affiches toujours la même image, où l'actualises-tu ?

    Je ne comprends pas ce que représentent tes différentes images mais voici un exemple de mise à jour d'images :
    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
    	private final JLabel imageComponent = new JLabel();
     
    	...
     
    	// Construction de l'affichage, imageComponent est placé
    	// où il doit être, on n'y touche plus par la suite.
     
    	...
     
    	public void actionPerformed(ActionEvent e) {
     
    		ImageIcon icon = //initialisation d'une nouvelle image...
    		imageComponent.setIcon(icon);
     
    		//  normalement ça suffit pour faire ce que tu souhaites.
           	}

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2008
    Messages : 33
    Par défaut
    Mais tu affiches toujours la même image, où l'actualises-tu ?
    En fait je l'actualise mais mon image actualisé a toujours le même nom.

    Je vais tester ce que tu me proposes.

  9. #9
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Le problème vient du fait que l'image des ImageIcon est gérée via un mécanisme de cache un peu bourrin au niveau de java, en particulier sur le fait que si le nom de fichier ne change pas, l'image ne change pas.

    Pour contourner cela il suffit de charger l'image via ImageIO.read et de créer une nouvelle ImageIcon avec la BufferedImage obtenue. Puis d'affecter cette image au composant et d'appeler repaint bien sûr.

Discussions similaires

  1. Image dans un Jpanel
    Par fontaigo dans le forum AWT/Swing
    Réponses: 7
    Dernier message: 19/04/2006, 18h13
  2. comment afficher une image dans un jpanel ?
    Par 180degrés dans le forum AWT/Swing
    Réponses: 7
    Dernier message: 18/04/2006, 15h33
  3. Persistance d'une image dans un JPanel
    Par Robiwan59 dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 15/02/2006, 19h20
  4. Rafraichir image dans un jPanel
    Par kentao dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 02/01/2006, 16h31
  5. [JPanel]Mettre une image dans un JPanel
    Par ehmppowa dans le forum Composants
    Réponses: 11
    Dernier message: 30/11/2005, 20h17

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