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 :

Listener sur JPanel


Sujet :

Java

  1. #1
    Membre habitué Avatar de snay13
    Homme Profil pro
    Inscrit en
    Juin 2009
    Messages
    236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2009
    Messages : 236
    Points : 166
    Points
    166
    Par défaut Listener sur JPanel
    Bonjour
    Je crée des jpanel dynamiquement et je dois créer des ecouteurs sur ces jpanels. Je dois pouvoir les identifier afin de modifier la couleur de fond lors d'un clic sur ce jpanel lors de sa selection ou non selection

    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
     
            PAN_Vignette = new Vignette[liste.length];
            for (int i = 0; i < liste.length; i++)
            {
     
                //Nom Fichier
                String nomFichier = new File(liste[i]).getName();
     
                PAN_Vignette[i] = new Vignette(
                    (int) ((scroll.getPreferredSize().width - 60) * 0.3),
                    (int) ((scroll.getPreferredSize().height - 45) * 0.45),
                    pathImage, nomFichier);
                PAN_Vignette[i].addMouseListener(this);
                PAN_Colonne1.add(PAN_Vignette[i]);
            }
    Comment faire pour identifier ces jpanel lors du clic ?

  2. #2
    Membre expérimenté 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
    Points : 1 540
    Points
    1 540
    Par défaut
    Quel est la finalité?
    Si tu veux réaliser une sorte de damier, tu devrais plutôt utiliser un unique panel et redéfinir la méthode paintComponent(Graphics g); pour dessiner un carré lors du clic de la souris.

  3. #3
    Membre habitué Avatar de snay13
    Homme Profil pro
    Inscrit en
    Juin 2009
    Messages
    236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2009
    Messages : 236
    Points : 166
    Points
    166
    Par défaut
    En fait j'affiche des sortes de vignette de fichiers images donc chaque jpanel doit être selectionnable pour récupérer le chemin du fichier et je dois pouvoir déselectionner la précédente lors d'un clic sur la nouvelle vignette

    Le tout est contenu dan un jpanel lui meme contenu dans un jscrollpane. J'affiche 3 images par ligne et seulemant 2 lignes et demi sont visibles.

  4. #4
    Membre expérimenté 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
    Points : 1 540
    Points
    1 540
    Par défaut
    Ce que je ferais :
    Un classe doit contenir les instances des différents JPanel. Appelons la GestionClique.
    J'applique un mouseListener à tous mes JPanel.
    Quand je clique sur un JPanel, j'active la méthode mouseQuelqueChose. Et dedans j'envoi un message à "GestionClique" en lui passant (this) en paramètres.
    GestionClique s'occupe de désaffectionner l'ancien panel sélectionner et de le remplacer par le nouveau.

  5. #5
    Membre habitué Avatar de snay13
    Homme Profil pro
    Inscrit en
    Juin 2009
    Messages
    236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2009
    Messages : 236
    Points : 166
    Points
    166
    Par défaut
    J'avoue ne pas trop voir comment faire

    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
    41
    42
    43
    44
    45
    JPanel PAN_Colonne1 = new JPanel();
            PAN_Colonne1.setPreferredSize(new Dimension(
                   (int) ((Informations.screenWidth - 15) * 0.65),
                    c));
            PAN_Colonne1.setBorder(BorderFactory.createLineBorder(Color.black, 5));
            PAN_Colonne1.setBackground(new Color(98, 181, 213));
            PAN_Colonne1.setLayout(new FlowLayout(FlowLayout.LEFT, 15, 15));
    
            JScrollPane scroll = new JScrollPane(PAN_Colonne1,
                    ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED,
                    ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
            scroll.setPreferredSize(new Dimension(
                    (int) ((Informations.screenWidth - 15) * 0.65),
                    (int) ((Informations.screenHeight - 15) * 0.8)));
            MonScrollBar UIScrollBar = new MonScrollBar();
            JScrollBar ScrollBar = new JScrollBar();
            ScrollBar.setUI(UIScrollBar);
            scroll.setVerticalScrollBar(ScrollBar);
            container.add(scroll);
            
            
            //Boucle recuperation + vignette
            PAN_Vignette = new Vignette[liste.length];
            for (int i = 0; i < liste.length; i++)
            {
                //Path image
                String pathImage = ManagerPath.getNomDossier(liste[i]) + "/1.png";
                /*//Date et Heure
                String formatDate = "dd/MM/yyyy"; SimpleDateFormat formaterDate = new SimpleDateFormat(formatDate);
                String formatHeure = "HH:mm"; SimpleDateFormat formaterHeure = new SimpleDateFormat(formatHeure);
                String date = formaterDate.format(new Date(new File(liste[i]).lastModified()));
                String heure = formaterHeure.format(new Date(new File(liste[i]).lastModified()));
                //Poids Fichier
                String poidsFichier =  "" + ((float) (new File(liste[i]).length()/1000))/1000 + "Mo";*/
                //Nom Fichier
                String nomFichier = new File(liste[i]).getName();
    
                PAN_Vignette[i] = new Vignette(
                    (int) ((scroll.getPreferredSize().width - 60) * 0.3),
                    (int) ((scroll.getPreferredSize().height - 45) * 0.45),
                    pathImage, nomFichier);
                //PAN_Vignette[i].setBorder(BorderFactory.createEmptyBorder());
                PAN_Vignette[i].addMouseListener(this);
                PAN_Colonne1.add(PAN_Vignette[i]);
    la classe de creation de vignette
    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
     
    public class Vignette extends JPanel 
    {
        private int width, height;
        private String image, nom;
        private JPanel conteneur, PAN_Gauche, PAN_Droit;
     
        public Vignette(int width, int height, String image, String nom)
        {
            this.width = width; this.height = height;
            this.image = image; this.nom = nom;
     
            //Conteneur
            conteneur = new JPanel();
            add(conteneur); conteneur.setLayout(new BorderLayout(0, 0));
     
            //Conteneur Image
            ThreadAffichageImage affichageImage = new ThreadAffichageImage(conteneur, width, height, image);
            affichageImage.execute();
     
            //Conteneur Gauche
            PAN_Gauche = new JPanel();
            PAN_Gauche.setBackground(new Color(204, 223, 242));
            PAN_Gauche.setPreferredSize(new Dimension(
                    (int) (this.width * 0.2),
                    (int) (this.height * 0.85)));
            conteneur.add(PAN_Gauche, BorderLayout.WEST);
            //Conteneur Droit
            PAN_Droit = new JPanel();
            PAN_Droit.setBackground(new Color(204, 223, 242));
            PAN_Droit.setPreferredSize(new Dimension(
                    (int) (this.width * 0.2),
                    (int) (this.height * 0.85)));
            conteneur.add(PAN_Droit, BorderLayout.EAST);
     
            //Conteneur Nom Fichier
            JPanel PAN_Nom = new JPanel();
            PAN_Nom.setPreferredSize(new Dimension(
                    this.width,
                    (int) (this.height * 0.15)));
            conteneur.add(PAN_Nom, BorderLayout.SOUTH); PAN_Nom.setLayout(new BorderLayout());
            //Fichier
            JLabel LAB_NomFichier = new JLabel(this.nom);
            LAB_NomFichier.setPreferredSize(new Dimension(
                    PAN_Nom.getPreferredSize().width,
                    PAN_Nom.getPreferredSize().height));
            LAB_NomFichier.setOpaque(true);
            LAB_NomFichier.setFont(new Font("Serif", Font.BOLD, 17));
            LAB_NomFichier.setBackground(new Color(0x3c3c3e));
            LAB_NomFichier.setForeground(Color.white);
            LAB_NomFichier.setHorizontalAlignment(SwingConstants.CENTER);
            LAB_NomFichier.setVerticalAlignment(SwingConstants.CENTER);
            PAN_Nom.add(LAB_NomFichier);
        }
    }
    Ensuite dans ma classe principale, j'ai mouseClicked mais comment identifier quel jpanel est solicité ?

  6. #6
    Membre habitué Avatar de snay13
    Homme Profil pro
    Inscrit en
    Juin 2009
    Messages
    236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2009
    Messages : 236
    Points : 166
    Points
    166
    Par défaut
    Bon, j'ai un petit peu avancé j'ai mis un mouseListener sur ma classe vignette et j'ai ajouté une méthode getName qui me permet de récupérer le nom de la vignette.

    Par contre je ne vois toujours pas comment deselectionner la précedente vignette lors d'une nouvelle selection



    Il doit bien exister quelque chose de plus simple à faire

    Toute idée est le bienvenue

    Merci

  7. #7
    Membre expérimenté 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
    Points : 1 540
    Points
    1 540
    Par défaut
    pas comment deselectionner la précedente vignette lors d'une nouvelle selection
    Tu crée une méthode "deselection" dans chacun de tes JPanels. et c'est "GestionClique" qui appellera cette méthode.
    COmme je l'avais suggéré
    GestionClique s'occupe de désaffectionner l'ancien panel sélectionner et de le remplacer par le nouveau.

  8. #8
    Membre habitué Avatar de snay13
    Homme Profil pro
    Inscrit en
    Juin 2009
    Messages
    236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2009
    Messages : 236
    Points : 166
    Points
    166
    Par défaut
    Desolé mais je ne vois pas à quoi correspond cette classe GestionClique
    Estce qu'elle correspond à ma classe vignette qui me permet de créer mes jpanel (vignette) ou dedans j'ai un mouseListener.

    Enfin bon j'ai réussi à peu près à réaliser ce que je voulais pour la selection deselection en rajoutant une methode dans ma classe vignette. Je pense que ce n'est pas ce que tu voulais me faire comprendre

    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
     
    public class Vignette extends JPanel implements MouseListener
    {
        static private JPanel droit = null, gauche = null;
        private int width, height;
        private String image, nom;
        private JPanel conteneur, PAN_Gauche, PAN_Droit, PAN_Nom;
        private JLabel LAB_NomFichier;
     
        public Vignette(int width, int height, String image, String nom)
        {
            this.width = width; this.height = height;
            this.image = image; this.nom = nom;
     
            //Conteneur
            conteneur = new JPanel(); conteneur.addMouseListener(this);
            add(conteneur); conteneur.setLayout(new BorderLayout(0, 0));
     
            //Conteneur Image
            ThreadAffichageImage affichageImage = new ThreadAffichageImage(conteneur, this.width, this.height, this.image);
            affichageImage.execute();
     
            //Conteneur Gauche
            PAN_Gauche = new JPanel();
            PAN_Gauche.setBackground(new Color(204, 223, 242));
            PAN_Gauche.setPreferredSize(new Dimension(
                    (int) (this.width * 0.2),
                    (int) (this.height * 0.85)));
            conteneur.add(PAN_Gauche, BorderLayout.WEST);
            //Conteneur Droit
            PAN_Droit = new JPanel();
            PAN_Droit.setBackground(new Color(204, 223, 242));
            PAN_Droit.setPreferredSize(new Dimension(
                    (int) (this.width * 0.2),
                    (int) (this.height * 0.85)));
            conteneur.add(PAN_Droit, BorderLayout.EAST);
     
            //Conteneur Nom Fichier
            PAN_Nom = new JPanel();
            PAN_Nom.setPreferredSize(new Dimension(
                    this.width,
                    (int) (this.height * 0.15)));
            conteneur.add(PAN_Nom, BorderLayout.SOUTH); PAN_Nom.setLayout(new BorderLayout());
            //Fichier
            LAB_NomFichier = new JLabel(this.nom);
            LAB_NomFichier.setPreferredSize(new Dimension(
                    PAN_Nom.getPreferredSize().width,
                    PAN_Nom.getPreferredSize().height));
            LAB_NomFichier.setOpaque(true);
            LAB_NomFichier.setFont(new Font("Serif", Font.BOLD, 17));
            LAB_NomFichier.setBackground(new Color(0x3c3c3e));
            LAB_NomFichier.setForeground(Color.white);
            LAB_NomFichier.setHorizontalAlignment(SwingConstants.CENTER);
            LAB_NomFichier.setVerticalAlignment(SwingConstants.CENTER);
            PAN_Nom.add(LAB_NomFichier);
        }
        @Override
        public String getName()
        {
            return nom;
        }
        @Override
        public void setName(String nom)
        {
            this.nom = nom;
        }
        public void setCouleurSelection(Color couleurSelection)
        {
            PAN_Droit.setBackground(couleurSelection);
            PAN_Gauche.setBackground(couleurSelection);
        }
        public void deselectionPanel()
        {
            if(droit != null && gauche != null)
            {
                droit.setBackground(new Color(204, 223, 242));
                gauche.setBackground(new Color(204, 223, 242));
            }
        }
        public void mouseClicked(MouseEvent e)
        {
            deselectionPanel();
            setCouleurSelection(Color.green);
            droit = PAN_Droit;
            gauche = PAN_Gauche;
        }
        public void mousePressed(MouseEvent e)  {}
        public void mouseReleased(MouseEvent e) {}
        public void mouseEntered(MouseEvent e)  {}
        public void mouseExited(MouseEvent e)   {}
    }
    Mais pour le coup je n'est aucune possibilité d'identifier mes jpanel dans ma classe principale

  9. #9
    Membre expérimenté 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
    Points : 1 540
    Points
    1 540
    Par défaut
    Il faut addMouseListener pour chaque Panel.
    Ensuite grâce à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public void mouseClicked(MouseEvent e)
    Tu peut récupérer le nom du panel grace à l'attribut e. (Je ne sais plus comment faire mais regarde la javadoc).

    Normalement à partir de la, le reste en découle naturellement.

  10. #10
    Membre habitué Avatar de snay13
    Homme Profil pro
    Inscrit en
    Juin 2009
    Messages
    236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2009
    Messages : 236
    Points : 166
    Points
    166
    Par défaut
    C'est ce que j'ai fais mais par exemple ayant l'habitude d'un actionPerformed un e.getSource me permet de savoir de quel bouton provient l'action. Avec un mouseClicked un e.getSource ne me permet d'identifier le jpanel et j'ai essayé les autres methodes sans plus de reussite.

  11. #11
    Membre habitué Avatar de snay13
    Homme Profil pro
    Inscrit en
    Juin 2009
    Messages
    236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2009
    Messages : 236
    Points : 166
    Points
    166
    Par défaut
    Ok c'était tout simple

    ce qui me manquait

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Vignette source = (Vignette) e.getSource();
    Encore Merci ivelios pour ta patience

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

Discussions similaires

  1. Listener sur JTable
    Par calypso dans le forum Composants
    Réponses: 3
    Dernier message: 05/02/2009, 16h27
  2. Language]Listener sur booléen
    Par harris_macken dans le forum Langage
    Réponses: 9
    Dernier message: 12/06/2005, 00h25
  3. [LISTENER] sur l'insertion de cd
    Par divxdede dans le forum Multimédia
    Réponses: 2
    Dernier message: 03/07/2004, 11h28
  4. [JSlider] listener sur Jslider
    Par Garion dans le forum Composants
    Réponses: 4
    Dernier message: 31/05/2004, 13h33
  5. Listener sur un JPanel
    Par ptitelfe dans le forum Agents de placement/Fenêtres
    Réponses: 3
    Dernier message: 27/03/2004, 13h14

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