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 :

Un souci avec les actionListener et JPanel


Sujet :

Java

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2010
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5
    Points : 1
    Points
    1
    Par défaut Un souci avec les actionListener et JPanel
    Bonjour à tous.
    Je débute actuellement avec les interfaces graphiques en java et j'ai quelques soucis avec l'utilisation d'un actionListener.
    Tout d'abord, voilà le code, je vous expliquerais ce que je veux faire ensuite.

    La Classe Traitement implémentée d'actionListener qui redéfinit la méthode actionPerformed
    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
    package p_fenetre;
     
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
     
    import javax.swing.JLabel;
     
    public class Traitement implements ActionListener {
    	private int i = 1;
    	JLabel label;
     
    	@Override
    	public void actionPerformed(ActionEvent e) {
    		// TODO Auto-generated method stub
    		System.out.println("Test No" +i);		
    		i++;
     
    	}
     
    }
    J'ai ensuite la classe Boutons qui me sert à initialiser des boutons
    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
    97
    98
    99
    100
    101
    102
    103
    104
    105
    package p_fenetre;
     
     
     
    import javax.swing.*;
     
     
     
    import java.awt.*;
     
    import java.awt.event.*;
     
     
     
    public class Boutons extends JButton implements MouseListener {
     
    	/**
     
             * 
     
             */
     
    	private static final long serialVersionUID = 1008958587886690045L;
     
     
     
    	/*Constructeur de la classe Boutons
     
    	 * Le bouton s'ecoute lui meme avec l'attribut "this" dans addMouseListener
     
    	 */
     
    	public Boutons(String str){
     
    		super(str);
     
    		this.addMouseListener(this);
     
     
     
    	}
     
     
     
    	@Override
     
    	public void mouseClicked(MouseEvent arg0) {
     
    		// TODO Auto-generated method stub
     
     
     
    	}
     
     
     
    	@Override
     
    	public void mouseEntered(MouseEvent arg0) {
     
    		// TODO Auto-generated method stub
     
    		this.setBackground(Color.CYAN);
     
    	}
     
     
     
    	@Override
     
    	public void mouseExited(MouseEvent arg0) {
     
    		// TODO Auto-generated method stub
     
    		this.setBackground(new JButton().getBackground());
     
    	}
     
     
     
    	@Override
     
    	public void mousePressed(MouseEvent arg0) {
     
    		// TODO Auto-generated method stub
     
     
     
    	}
     
     
     
    	@Override
     
    	public void mouseReleased(MouseEvent arg0) {
     
    		// TODO Auto-generated method stub
     
     
     
    	}
     
     
     
    }
    Dans ma classe SideBar héritée de JPanel, j'instancie tous les boutons dont j'aurais besoin
    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
    package p_fenetre;
    import javax.swing.*;
     
    import java.awt.*;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
     
    public class SideBar extends JPanel implements ActionListener{
    	/**
             * 
             */
    	private static final long serialVersionUID = -7717883325397196472L;
    	//Initialisation des 6 boutons � partir de la classe Boutons
    	private Boutons b1 = new Boutons("Ligne Verticale");
    	private Boutons b2 = new Boutons("Ligne Horizontale");
    	private Boutons b3 = new Boutons("Ligne Oblique");
    	private Boutons b4 = new Boutons("Intersection Y");
    	private Boutons b5 = new Boutons("Intersection T");
    	private Boutons b6 = new Boutons("Intersection X");
     
    	//D�termination de la taille de la SideBar
    	Dimension tailleEcran = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
    	//private int hauteur = (int)(tailleEcran.getHeight()-22);
    	private int largeur = (int)(tailleEcran.getWidth()/4);
     
    	public SideBar(){
    		// Background en Gris juste pour distinguer les 2 conteneurs pdt l'elaboration de l'interface
    		this.setBackground(Color.LIGHT_GRAY);
     
    		//Positionnement des boutons
    		this.setLayout(null);
    		this.b1.setBounds(0,0,(this.largeur),50);
    		this.b2.setBounds(0,60,(this.largeur),50);
    		this.b3.setBounds(0,120,(this.largeur),50);
    		this.b4.setBounds(0,180,(this.largeur),50);
    		this.b5.setBounds(0,240,(this.largeur),50);
    		this.b6.setBounds(0,300,(this.largeur),50);
     
     
    		this.b1.addActionListener(new Traitement());
    		//Ajout dans le conteneur
    		this.add(b1);
    		this.add(b2);
    		this.add(b3);
    		this.add(b4);
    		this.add(b5);
    		this.add(b6);
     
    	}
     
    	@Override
    	public void actionPerformed(ActionEvent e) {
    		// TODO Auto-generated method stub
     
    	}
    }
    Ma classe Conteneur (qui porte mal son nom en fait) qui est aussi héritée de JPanel
    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
    package p_fenetre;
     
     
     
    import javax.swing.*;
     
    import java.awt.*;
     
    import java.awt.event.ActionEvent;
     
    import java.awt.event.ActionListener;
     
     
     
     
     
     
     
    public class Conteneur extends JPanel implements ActionListener{
     
    	/**
     
             * 
     
             */
     
    	private static final long serialVersionUID = 6620292449857381975L;
     
    	Dimension tailleEcran = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
     
    	private int hauteur = (int)(tailleEcran.getHeight()-22);
     
    	private int largeur = (int)(tailleEcran.getWidth()/4);
     
    	JLabel label = new JLabel("Test");
     
     
     
    	public Conteneur(){
     
    		this.setBackground(Color.WHITE);
     
    		this.setLayout(null);
     
    		this.label.setBounds(0,0,this.largeur*3/4,this.hauteur);
     
    		this.add(label);
     
     
     
     
     
    	}
     
     
     
    	@Override
     
    		public void actionPerformed(ActionEvent e) {
     
     
     
    		}
     
     
     
    }
    Et ma classe Fenetre qui crée une fenêtre et s'occupe de créer un conteneur qui contiendra Conteneur et SideBar
    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
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    package p_fenetre;
     
    import javax.swing.*;
     
    import java.awt.*;
     
    import java.awt.event.ActionEvent;
     
    import java.awt.event.ActionListener;
     
     
     
    public class Fenetre extends JFrame{
     
     
     
    	/**
     
             * 
     
             */
     
    	private static final long serialVersionUID = -929792336357849312L;
     
    	/**
     
             * @param args
     
             */
     
     
     
    	//Appel des differentes Classes
     
    	private Conteneur pan = new Conteneur();
     
    	private JPanel container = new JPanel();
     
    	private SideBar side = new SideBar();
     
     
     
    	//Initialisation des variables g�rant la taille de la fenetre
     
    	Dimension tailleEcran = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
     
    	private int hauteur = (int)tailleEcran.getHeight()-22;
     
    	private int largeur = (int)tailleEcran.getWidth();
     
     
     
    	//Initialisation de la barre MENU
     
    	private JMenuBar menuBar = new JMenuBar();
     
    	private JMenu test1 = new JMenu("Fichier");
     
    	private JMenu test1_2 = new JMenu("Sous ficher");
     
    	private JMenu test2 = new JMenu("Edition");
     
     
     
    	private JMenuItem item1 = new JMenuItem("Ouvrir");
     
    	private JMenuItem item2 = new JMenuItem("Fermer");
     
    	private JMenuItem item3 = new JMenuItem("Lancer");
     
    	private JMenuItem item4 = new JMenuItem("Arr�ter");
     
     
     
    	private JCheckBoxMenuItem jcmi1 = new JCheckBoxMenuItem("Choix 1");
     
    	private JCheckBoxMenuItem jcmi2 = new JCheckBoxMenuItem("Choix 2");
     
     
     
    	private JRadioButtonMenuItem jrmi1 = new JRadioButtonMenuItem("Radio 1");
     
    	private JRadioButtonMenuItem jrmi2 = new JRadioButtonMenuItem("Radio 2");
     
     
     
    	public Fenetre(){
     
     
     
    		//Initialisation de la fenetre
     
    		this.setTitle("WYP");
     
    		this.pack();
     
    		Fenetre.setDefaultLookAndFeelDecorated(true);
     
    		this.setExtendedState(Fenetre.MAXIMIZED_BOTH);
     
    		this.setMinimumSize(new Dimension(this.largeur,this.hauteur));
     
    		this.setLocationRelativeTo(null);
     
    		this.setResizable(true);
     
    		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
     
     
    		/*REPRISE DU CODE DU SDZ POUR LES MENUS (JUSTE POUR AVOIR UNE IDEE DE CE QUE CA PEUT DONNER)*/
     
    		this.test1.add(item1);
     
     
     
    		//On ajoute les �l�ments dans notre sous-menu
     
    		this.test1_2.add(jcmi1);
     
    		this.test1_2.add(jcmi2);
     
    		//Ajout d'un s�parateur
     
    		this.test1_2.addSeparator();
     
    		//On met nos radios dans un ButtonGroup
     
    		ButtonGroup bg = new ButtonGroup();
     
    		bg.add(jrmi1);
     
    		bg.add(jrmi1);
     
                    //On pr�s�lectionne la premi�re radio
     
    		jrmi1.setSelected(true);
     
     
     
    		this.test1_2.add(jrmi1);
     
    		this.test1_2.add(jrmi2);
     
     
     
    		//Ajout du sous-menu dans notre menu
     
    		this.test1.add(this.test1_2);
     
    		//Ajout d'un s�parateur
     
    		this.test1.addSeparator();
     
    		item2.addActionListener(new ActionListener(){
     
    			public void actionPerformed(ActionEvent arg0) {
     
    				System.exit(0);
     
    			}				
     
    		});
     
    		this.test1.add(item2);
     
     
     
    		this.test2.add(item3);
     
    		this.test2.add(item4);
     
     
     
                    //L'ordre d'ajout va d�terminer l'ordre d'apparition dans le menu de gauche � droite
     
                    //Le premier ajout� sera tout � gauche de la barre de menu et inversement pour le dernier
     
    			this.menuBar.add(test1);
     
    			this.menuBar.add(test2);
     
    			//-------------------------
     
     
     
    			this.setJMenuBar(menuBar);
     
     
     
    		//Ajout des conteneurs
     
    		this.container.setBackground(Color.WHITE);
     
    		this.container.setLayout(null);
     
    		this.pan.setBounds(0,0,(this.largeur*3/4),this.hauteur);
     
    		this.side.setBounds((this.largeur*3/4),0,(this.largeur/4),(this.hauteur));
     
    		this.container.add(pan);
     
    		this.container.add(side);
     
    		this.setContentPane(this.container);
     
     
     
    		this.setVisible(true);
     
    	}
     
     
     
    }
    Alors voilà mon problème....
    J'aimerais que l'un de mes boutons que j'ai instancié dans ma classe SideBar puisse (quand je clique dessus) changer le texte d'un JLabel qui serait présent dans ma classe Conteneur....
    Seulement, je dois m'emmêler les pinceaux et je n'arrive pas à réaliser cela.
    Un petit coup de main serait le bienvenu et apprécié :-)

    Dans l'attente de vos réponses éclairées, j'en suis sûr.

  2. #2
    Expert éminent
    Avatar de _skip
    Homme Profil pro
    Développeur d'applications
    Inscrit en
    Novembre 2005
    Messages
    2 898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur d'applications
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 898
    Points : 7 752
    Points
    7 752
    Par défaut
    Tu crées un constructeur dans ton ActionListener qui prend le label en paramètre...
    Mais ton implémentation sonne excessivement bizarre, surtout cette classe boutons extends jbutton dont le rôle est incompréhensible.

  3. #3
    Membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juin 2008
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juin 2008
    Messages : 34
    Points : 53
    Points
    53
    Par défaut
    Bonjour,

    en fait pour modifier le text d'un JLabel dans une action, il faut que ton action connaisse ton objet JLabel.

    C'est en fait la raison pour laquelle on voit souvent une classe anonyme pour les ActionListener car étant créé en tant que paramètre de ton bouton contenu dans ta fenêtre, cette action à accès directement au JLabel de cette même fenêtre.

    Un exemple sera certainement plus parlant (juste en appelant cette methode depuis une methode main) :
    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
     
    public static void testSwingAction(){
    		JFrame frame = new JFrame("test swing");
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		frame.setPreferredSize(new Dimension(300, 200));
    		JPanel panel = new JPanel();		
    		final JTextField field = new JTextField();
    		field.setPreferredSize(50,20);
    		JButton button = new JButton("modifier");
    		final JLabel label = new JLabel("init");
    		button.addMouseListener(new MouseListener(){
     
    			public void mouseClicked(MouseEvent e) {
    				label.setText(field.getText());
    			}
     
    			public void mouseEntered(MouseEvent e) {
    				// TODO Implémenter
     
    			}
    			public void mouseExited(MouseEvent e) {
    				// TODO Implémenter
     
    			}
    			public void mousePressed(MouseEvent e) {
    				// TODO Implémenter
     
    			}
    			public void mouseReleased(MouseEvent e) {
    				// TODO Implémenter
     
    			}			
    		});
     
    		panel.add(field);
    		panel.add(button);
    		panel.add(label);
     
    		frame.setContentPane(panel);
    		frame.pack();
    		frame.setVisible(true);
    	}
    Cette solution n'est pas obligatoire, ce qu'il faut comprendre c'est que ton Action à nécessairement besoin de connaitre le JLabel pour le modifier.

    Tu pourrai par exemple avoir un new MonActionListener(JLabel label, String newText) ou un parametre plus large comme Component (implement ActionListener ou MouseListener), qui écrit le newText dans ton label.

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 107
    Points : 120
    Points
    120
    Par défaut
    Bonjour,

    Pourquoi ne pas créer une association entre votre classe Conteneur et votre classe sideBar ?.
    Ainsi vous aurez accès à tous les objets liés à voter classe Conteneur via votre classe sideBar.

    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
     
    public class SideBar extends JPanel implements ActionListener{
            [ ... ]
            Conteneur conteneur;
     
    	public SideBar(Conteneur monConteneur){
     
                  this.conteneur = monConteneur;//référence sur la classe Conteneur
                  [ ... ]
            }
     
            public void setLabelConteneur(String leTexte){
     
                   //Ici tu modifie le texte du JLabel provenant du conteneur
                   conteneur.labelConteneur.setText(leTexte);
            }
    }
    Vous appelez la fonction setLabelConteneur de l'actionlistener de votre bouton.

    ps : Ici dans mon exemple j'ai définis mon JLabe,l de la classe Conteneur, en public. Mais c'est à éviter.

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2010
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Tout d'abord, merci à vous d'avoir répondu si vite :-)
    Alors voilà, j'ai essayer de modifier mon bout de code concernant l'ajout du ActionListener sur mon bouton b1 dans la classe SideBar en m'inspirant de que tu as écris ninlock et j'obtiens ceci :

    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
    this.b1.addActionListener(new ActionListener(){
    	Dimension tailleEcran = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
    	private int hauteur = (int)(tailleEcran.getHeight()-22);
    	private int largeur = (int)(tailleEcran.getWidth()/4);
    	@Override
    	public void actionPerformed(ActionEvent e) {
    		// TODO Auto-generated method stub
    		conteneur.setLayout(null);
    		System.out.println("Test No "+i); // Juste pour vérifier que l'actionListener fonctionne en mode console est c'est le cas
    		conteneur.label.setText("Test No "+i);
    		i++;
    		conteneur.label.setBounds(0, 0, this.largeur, this.hauteur);
    		conteneur.add(conteneur.label);
    	}
    });
    //Ajout dans le conteneur
    this.add(b1);
    Pour le coup, je n'obtiens pas d'erreur à la compilation mais lorsque je clike sur mon bouton, il m'affiche bien "Test No ..." en console avec le println mais, il ne se passe toujours rien dans ma classe Conteneur :-(
    Mais bon, je sens qu'on se rapproche du but :-)

  6. #6
    Membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juin 2008
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juin 2008
    Messages : 34
    Points : 53
    Points
    53
    Par défaut
    tu n'as pas besoin de faire conteneur.add(conteneur.label) car ton label est deja dans ton conteneur.
    De plus le conteneur.label.setBounds(...) n'est pas utile non plus, fait plutot un setPreferedSize(new Dimension(this.largeur, this.hauteur)).
    Mais essaye d'abord un code le plus simple possible de maniere pouvoir constater les effet de bord et enrichi au fur et a mesure.

    Et utilise un MouseListener a la place du ActionListener pour redéfinir uniquement le mouseEvent() car sinon chaque action sur ton bouton est intercepté et du coup tu contrôle pas bien ton composant, sinon il faut ajouter une condition sur e.getEvent(). Et pour répéter ce que j'ai écrit plus haut, il faut toujours faire au plus simple avec le moins d'effet de bord possible..

  7. #7
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2010
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Déjà merci de prendre le temps de me répondre, c'est sympa
    Je sais bien qu'il faudrait que je fasse un code plus simple mais à vrai dire, je n'ai pas vraiment le temps mais ça c'est une autre histoire....
    Pour faire simple, je suis en 2ème année de licence informatique. Nous avons un projet de programmation à faire qui est un robot suiveur de ligne.Pour le coup, notre projet marche comme sur des roulettes et répond à toutes les attentes de notre Professeur encadrant. Le hic, c'est qu'on a tellement bien réussi notre projet (en avance sur les délais imposés), que ce même professeur nous demande de créer une IHM pour permettre à l'utilisateur de choisir lui même le chemin de notre robot suiveur de ligne aux moyens de segments et d'intersections.
    Résultat des courses, notre groupe a environ 2/3 semaines pour créer cette dite interface en devant dans le même temps apprendre tous le cours de Java sur les interfaces graphiques qui se fait normalement en 3ème année.

    Quand je teste un bouton qui se trouve dans ma classe Conteneur et qu'il engendre une action ça marche impec, c'est juste le passage du bouton dans une autre classe pour avoir le même effet qui me pose problème.

    Voici maintenant ma classe SideBar
    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
    package p_fenetre;
    import javax.swing.*;
     
    import java.awt.*;
    import java.awt.event.MouseEvent;
    import java.awt.event.MouseListener;
     
    public class SideBar extends JPanel{
    	/**
             * 
             */
    	private static final long serialVersionUID = -7717883325397196472L;
    	//Initialisation des 6 boutons � partir de la classe Boutons
    	private Boutons b1 = new Boutons("Ligne Verticale");
    	private Boutons b2 = new Boutons("Ligne Horizontale");
    	private Boutons b3 = new Boutons("Ligne Oblique");
    	private Boutons b4 = new Boutons("Intersection Y");
    	private Boutons b5 = new Boutons("Intersection T");
    	private Boutons b6 = new Boutons("Intersection X");
     
    	//D�termination de la taille de la SideBar
    	Dimension tailleEcran = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
    	//private int hauteur = (int)(tailleEcran.getHeight()-22);
    	private int largeur = (int)(tailleEcran.getWidth()/4);
     
    	Conteneur conteneur;
    	private int i = 1;
     
    	public SideBar(final Conteneur conteneur){
    		this.conteneur = conteneur;
    		// Background en Gris juste pour distinguer les 2 conteneurs pdt l'elaboration de l'interface
    		this.setBackground(Color.LIGHT_GRAY);
     
    		//Positionnement des boutons
    		this.setLayout(null);
    		this.b1.setBounds(0,0,(this.largeur),50);
    		this.b2.setBounds(0,60,(this.largeur),50);
    		this.b3.setBounds(0,120,(this.largeur),50);
    		this.b4.setBounds(0,180,(this.largeur),50);
    		this.b5.setBounds(0,240,(this.largeur),50);
    		this.b6.setBounds(0,300,(this.largeur),50);
     
    //MODIFICATION DE MON ACTION LISTENER	
    	this.b1.addMouseListener(new MouseListener(){
    	Dimension tailleEcran = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
    	private int hauteur = (int)(tailleEcran.getHeight()-22);
    	private int largeur = (int)(tailleEcran.getWidth()/4);
    	@Override
    	public void mouseClicked(MouseEvent e) {
    		// TODO Auto-generated method stub
    		System.out.println("Test No "+i); // Juste pour vérifier que l'actionListener fonctionne en mode console est c'est le cas
    		conteneur.label.setText("Test No "+i);
    		i++;
    		conteneur.label.setPreferredSize(new Dimension(this.largeur,this.hauteur/4));
     
    	}
    	@Override
    	public void mouseEntered(MouseEvent e) {
    		// TODO Auto-generated method stub
     
    	}
    	@Override
    	public void mouseExited(MouseEvent e) {
    		// TODO Auto-generated method stub
     
    	}
    	@Override
    	public void mousePressed(MouseEvent e) {
    		// TODO Auto-generated method stub
     
    	}
    	@Override
    	public void mouseReleased(MouseEvent e) {
    		// TODO Auto-generated method stub
     
    	}
     
    });
    //Ajout dans le conteneur
    		this.add(b1);
    		this.add(b2);
    		this.add(b3);
    		this.add(b4);
    		this.add(b5);
    		this.add(b6);
     
    	}
     
    }
    Et le code de ma classe Conteneur dans laquelle l'action devrait se passer....
    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
    package p_fenetre;
     
    import javax.swing.*;
    import java.awt.*;
     
     
     
     
     
    public class Conteneur extends JPanel{
    	/**
             * 
             */
    	private static final long serialVersionUID = 6620292449857381975L;
    	Dimension tailleEcran = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
    	//private int hauteur = (int)(tailleEcran.getHeight()-22);
    	//private int largeur = (int)(tailleEcran.getWidth()/4);
    	protected JLabel label = new JLabel();		
    	public Conteneur(){
    		this.setBackground(Color.WHITE);
    		this.setLayout(null);
    		this.add(this.label);
     
     
    	}
     
    }
    Avec MouseListener, j'obtiens exactement le même effet qu'avec l'actionListener quand je redéfinis la méthode mouseClicked.
    Je suis vraiment désolé, car ça doit sans doute vous paraître évident pour vous, mais, j'ai encore du mal à me repérer en faisant les interfaces graphiques

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 107
    Points : 120
    Points
    120
    Par défaut
    Le soucis viens de :
    En gros il n'y a aucun gestionnaire de layout sur ton panel Conteneur. Donc il te faut gérer toi même la disposition de tes élements.

    Il te manque donc l'instruction setBounds(x,y,L,H); ce qui donnerais un truc du genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    private static final long serialVersionUID = 6620292449857381975L;
    	Dimension tailleEcran = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
    	private int hauteur = (int)(tailleEcran.getHeight()-22);
    	private int largeur = (int)(tailleEcran.getWidth()/4);
    	protected JLabel label = new JLabel("tintin dans tintin au tibet");//Juste pour tester la présence du label au démarrage
    	public Conteneur(){
    		this.setBackground(Color.WHITE);
                    setLayout(null);
    		this.add(this.label);
                    label.setBounds(0,0,this.largeur, this.hauteur/4);//positionne le label
     
    	}
    Le setBounds est à faire après l'addition de ton label à ton conteneur.

    Si tu ne veux pas utiliser le setBounds() tu peux utiliser le setLocation() et le setPreferredSize().

  9. #9
    Modérateur
    Avatar de Hizin
    Homme Profil pro
    Développeur mobile
    Inscrit en
    Février 2010
    Messages
    2 180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur mobile

    Informations forums :
    Inscription : Février 2010
    Messages : 2 180
    Points : 5 072
    Points
    5 072
    Par défaut
    Ou sinon, utiliser un vrai layout et le mettre en oeuvre.

    Regarde ici pour une liste : http://www.developpez.net/forums/d52...rents-layouts/

    Je te conseil la lecture des tuto "How to use ..." trouvable sur le net avec le layout qui te paraîtra approprié.
    C'est Android, PAS Androïd, ou Androïde didiou !
    Le premier est un OS, le second est la mauvaise orthographe du troisième, un mot français désignant un robot à forme humaine.

    Membre du comité contre la phrase "ça marche PAS" en titre et/ou explication de problème.

    N'oubliez pas de consulter les FAQ Android et les cours et tutoriels Android

  10. #10
    Membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juin 2008
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juin 2008
    Messages : 34
    Points : 53
    Points
    53
    Par défaut
    Enlève le setLayout(null) pour faire tes test, et après manipule plutôt des Layout déjà défini c'est plus pratique, comme te l'a conseillé Hizin.

    Je viens de tester ton code et je ne vois même pas ton label (en mettant du texte dedans) quand je lance l'appli.

    Donc cela fonctionne mais on ne vois pas le label.

    Voici la correction (remplace le constructeur de Conteneur par celui-ci):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    public Conteneur(){
    		label.setPreferredSize(new Dimension(50, 20));
    		this.setLayout(new BorderLayout());
    		this.setBackground(Color.WHITE);
    		this.add(this.label, BorderLayout.CENTER);
    	}

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 107
    Points : 120
    Points
    120
    Par défaut
    Ninlock j'ai deja fait la correction avec son layout à lui. Mais aprés c'est vrai qu'il faut plus s'orienter vers un gridBagLayout, FormLayout ou MigLayout pour créer une interface sympas et qui se redimensionne en fonction de la place disponible.

  12. #12
    Membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juin 2008
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juin 2008
    Messages : 34
    Points : 53
    Points
    53
    Par défaut
    Ok, très bien.
    Oui concernant les layout c'était un exemple ce que je t'ai donné. Il faut juste utiliser el bon en fonction de ses besoins.

    Merci de marquer ce sujet comme résolu.

  13. #13
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2010
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par ninlock Voir le message
    Voici la correction (remplace le constructeur de Conteneur par celui-ci):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    public Conteneur(){
    		label.setPreferredSize(new Dimension(50, 20));
    		this.setLayout(new BorderLayout());
    		this.setBackground(Color.WHITE);
    		this.add(this.label, BorderLayout.CENTER);
    	}
    En utilisant ce constructeur pour ma classe Conteneur, tu arrives à afficher le JLabel ? oO
    Pour le coup, j'ai testé exactement le programme avec ce que tu proposes et il n'y a aucune différence : /
    Je remets mon code actuel pour que vous vous fassiez une idée.
    La classe SideBar
    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
    package p_fenetre;
    import javax.swing.*;
     
    import java.awt.*;
    import java.awt.event.MouseEvent;
    import java.awt.event.MouseListener;
     
    public class SideBar extends JPanel{
    	/**
             * 
             */
    	private static final long serialVersionUID = -7717883325397196472L;
    	//Initialisation des 6 boutons � partir de la classe Boutons
    	private Boutons b1 = new Boutons("Ligne Verticale");
    	private Boutons b2 = new Boutons("Ligne Horizontale");
    	private Boutons b3 = new Boutons("Ligne Oblique");
    	private Boutons b4 = new Boutons("Intersection Y");
    	private Boutons b5 = new Boutons("Intersection T");
    	private Boutons b6 = new Boutons("Intersection X");
     
    	//D�termination de la taille de la SideBar
    	Dimension tailleEcran = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
    	//private int hauteur = (int)(tailleEcran.getHeight()-22);
    	private int largeur = (int)(tailleEcran.getWidth()/4);
     
    	Conteneur conteneur;
    	private int i = 1;
     
    	public SideBar(final Conteneur conteneur){
    		this.conteneur = conteneur;
    		// Background en Gris juste pour distinguer les 2 conteneurs pdt l'elaboration de l'interface
    		this.setBackground(Color.LIGHT_GRAY);
     
    		//Positionnement des boutons
    		this.setLayout(null);
    		this.b1.setBounds(0,0,(this.largeur),50);
    		this.b2.setBounds(0,60,(this.largeur),50);
    		this.b3.setBounds(0,120,(this.largeur),50);
    		this.b4.setBounds(0,180,(this.largeur),50);
    		this.b5.setBounds(0,240,(this.largeur),50);
    		this.b6.setBounds(0,300,(this.largeur),50);
     
    //MODIFICATION DE MON ACTION LISTENER	
    	this.b1.addMouseListener(new MouseListener(){
    	Dimension tailleEcran = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
    	private int hauteur = (int)(tailleEcran.getHeight()-22);
    	private int largeur = (int)(tailleEcran.getWidth()/4);
    	@Override
    	public void mouseClicked(MouseEvent e) {
    		// TODO Auto-generated method stub
    		//System.out.println("Test No "+i); // Juste pour vérifier que l'actionListener fonctionne en mode console est c'est le cas
    		conteneur.label.setText("Test No "+i);
    		i++;
    		conteneur.label.setPreferredSize(new Dimension(this.largeur,this.hauteur/4));
     
    	}
    	@Override
    	public void mouseEntered(MouseEvent e) {
    		// TODO Auto-generated method stub
     
    	}
    	@Override
    	public void mouseExited(MouseEvent e) {
    		// TODO Auto-generated method stub
     
    	}
    	@Override
    	public void mousePressed(MouseEvent e) {
    		// TODO Auto-generated method stub
     
    	}
    	@Override
    	public void mouseReleased(MouseEvent e) {
    		// TODO Auto-generated method stub
     
    	}
     
    });
    //Ajout dans le conteneur
    		this.add(b1);
    		this.add(b2);
    		this.add(b3);
    		this.add(b4);
    		this.add(b5);
    		this.add(b6);
     
    	}
     
    }
    La classe Conteneur
    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
    package p_fenetre;
     
    import javax.swing.*;
    import java.awt.*;
     
     
     
     
     
    public class Conteneur extends JPanel{
    	/**
             * 
             */
    	private static final long serialVersionUID = 6620292449857381975L;
    	Dimension tailleEcran = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
    	private int hauteur = (int)(tailleEcran.getHeight()-22);
    	private int largeur = (int)(tailleEcran.getWidth()/4);
    	JLabel label = new JLabel();		
    	public Conteneur(){
    		this.label.setPreferredSize(new Dimension(this.largeur, this.hauteur/4));
    		this.setLayout(new BorderLayout());
    		this.setBackground(Color.WHITE);
    		this.add(this.label, BorderLayout.WEST);
    	}
     
    }
    Et la classe Fenetre héritée de JFrame qui fait le lien entre mon JPanel Fenetre et mon JPanel SideBar
    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
    package p_fenetre;
    import javax.swing.*;
    import java.awt.*;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
     
    public class Fenetre extends JFrame{
     
    	/**
             * 
             */
    	private static final long serialVersionUID = -929792336357849312L;
    	/**
             * @param args
             */
     
    	//Appel des differentes Classes
    	private Conteneur pan = new Conteneur();
    	private JPanel container = new JPanel();
    	private SideBar side = new SideBar(new Conteneur());
     
    	//Initialisation des variables g�rant la taille de la fenetre
    	Dimension tailleEcran = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
    	private int hauteur = (int)tailleEcran.getHeight()-22;
    	private int largeur = (int)tailleEcran.getWidth();
     
    	//Initialisation de la barre MENU
    	private JMenuBar menuBar = new JMenuBar();
    	private JMenu test1 = new JMenu("Fichier");
    	private JMenu test1_2 = new JMenu("Sous ficher");
    	private JMenu test2 = new JMenu("Edition");
     
    	private JMenuItem item1 = new JMenuItem("Ouvrir");
    	private JMenuItem item2 = new JMenuItem("Fermer");
    	private JMenuItem item3 = new JMenuItem("Lancer");
    	private JMenuItem item4 = new JMenuItem("Arr�ter");
     
    	private JCheckBoxMenuItem jcmi1 = new JCheckBoxMenuItem("Choix 1");
    	private JCheckBoxMenuItem jcmi2 = new JCheckBoxMenuItem("Choix 2");
     
    	private JRadioButtonMenuItem jrmi1 = new JRadioButtonMenuItem("Radio 1");
    	private JRadioButtonMenuItem jrmi2 = new JRadioButtonMenuItem("Radio 2");
     
    	public Fenetre(){
     
    		//Initialisation de la fenetre
    		this.setTitle("WYP");
    		this.pack();
    		Fenetre.setDefaultLookAndFeelDecorated(true);
    		this.setExtendedState(Fenetre.MAXIMIZED_BOTH);
    		this.setMinimumSize(new Dimension(this.largeur,this.hauteur));
    		this.setLocationRelativeTo(null);
    		this.setResizable(true);
    		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    //Je Zappe tout ce qui est initialisation des JMenuItem
    		//Ajout des conteneurs
    		this.container.setBackground(Color.WHITE);
    		this.container.setLayout(null);
    		this.pan.setBounds(0,0,(this.largeur*3/4),this.hauteur);
    		this.side.setBounds((this.largeur*3/4),0,(this.largeur/4),(this.hauteur));
    		this.container.add(pan);
    		this.container.add(side);
    		this.setContentPane(this.container);
     
    		this.setVisible(true);
    	}
     
    }

  14. #14
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2010
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    C'est bon, j'ai résolu le problème avec un des membres de mon groupe, merci à vous d'avoir pris le temps de répondre

  15. #15
    Membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juin 2008
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juin 2008
    Messages : 34
    Points : 53
    Points
    53
    Par défaut
    Oui, en effet je l'ai fait fonctionné en modifiant le new SideBar() dans Fenetre en new SideBar(pan), car j'ai pris le premier code que tu a écrit au début du poste en prenant celui de ton dernier ou tu a mis SideBar et Fenetre.
    Evidemment le label ce voit qu'après le clique sur le bouton Ligne Verticale.

    Il aurait été bien que tu explique comment tu a résolu ton probleme pour ceux qui aurait le même probleme ou presque.

    pour te montrer que cela à fonctionné regarde la pièce jointe.
    Images attachées Images attachées  

Discussions similaires

  1. [Dates] souci avec les dates
    Par Ludo75 dans le forum Langage
    Réponses: 3
    Dernier message: 22/02/2006, 17h15
  2. Soucis avec les JTables et les listener
    Par shingo dans le forum Composants
    Réponses: 2
    Dernier message: 22/02/2006, 11h51
  3. Soucis avec les Graphiques dans les états
    Par Chococrocq dans le forum IHM
    Réponses: 27
    Dernier message: 04/01/2006, 19h03
  4. petit soucis avec les listes
    Par Death83 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 03/09/2005, 10h08
  5. Réponses: 7
    Dernier message: 05/10/2004, 13h44

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