IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

AWT/Swing Java Discussion :

Récupération d'une valeur d'un listener


Sujet :

AWT/Swing Java

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2018
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Orne (Basse Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2018
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Récupération d'une valeur d'un listener
    Bonjour,
    Je fais un programme ou je déclare une variable appelée c. Dans une interface graphique, j'utilise un radiobutton qui fait modifier la valeur de c dans un actionlistener.
    Le problème c'est que cette valeur ne se modifie que dans l'action listener, mais je voudrais extraire cette valeur pour l'utiliser dans le programme en entier.
    J'aimerais savoir comment faire.
    Voici le 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
    public class InterfaceGraphique extends JPanel{
     
    	public int c;
     
     
    	}
     
    	private final ButtonGroup buttonGroup = new ButtonGroup();
     
    	public InterfaceGraphique() {
    		setLayout(null);
     
     
    		JRadioButton rouge = new JRadioButton("Rouge");
    		buttonGroup.add(rouge);
    		rouge.setBounds(480, 639, 89, 23);
    		add(rouge);
     
     
    		JButton btnValider = new JButton("Valider");
    		btnValider.addActionListener(new ActionListener() {
    			public void actionPerformed(ActionEvent e) {
     
     
    				if (rouge.isSelected()==true){
    					c = 1;
    				}if (vert.isSelected()==true){
    					c = 2;
    				}if (orange.isSelected()==true){
    					c = 3;
    				}if (rose.isSelected()==true){
    					c = 4;
    				}if (gris.isSelected()==true){
    					c = 5;
    				}if (bleu.isSelected()==true){
    					c = 6; 
    				}
    				System.out.println(c);
    			}
     
    		});
    		btnValider.setBounds(412, 557, 89, 23);
    		add(btnValider);

    Merci d'avance de votre aide

  2. #2
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Points : 7 163
    Points
    7 163
    Par défaut
    D'après ton code, la donnée membre "c" est correctement modifiée et la modification est visible depuis l'extérieur de la méthode.
    Tu prends probablement le problème à l'envers : j'imagine que tu souhaite non seulement modifier la donnée membre "c" mais aussi provoquer une autre action, non ?
    Donne plus de détail sur ta façon d'utiliser cette variable "c".
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2018
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Orne (Basse Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2018
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Je suis en train de coder un mastermind ( avec un ami).
    Nous utilisons donc cette variable c et nous voulons lui modifier sa valeur avec le bouton valider.
    La valeur de c est donc bien modifiée dans le action listener (on arrive à faire afficher la nouvelle valeur avec le system.out.println dans le action listener) mais une fois sortie du action listener c reprend sa valeur initiale (0).

    Je fais sans doute une erreur quelque part mais je n'arrive pas à récupérer la nouvelle valeur de c en dehors du 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
    21
    22
    23
    24
    25
    26
    27
    JButton btnValider = new JButton("Valider");
    		btnValider.addActionListener(new ActionListener() {
    			public void actionPerformed(ActionEvent e) {
     
     
    				if (rouge.isSelected()==true){
    					c = 1;
    				}if (vert.isSelected()==true){
    					c = 2;
    				}if (orange.isSelected()==true){
    					c = 3;
    				}if (rose.isSelected()==true){
    					c = 4;
    				}if (gris.isSelected()==true){
    					c = 5;
    				}if (bleu.isSelected()==true){
    					c = 6; 
    				}
    				System.out.println(c);
    			}
     
    		});
    		btnValider.setBounds(412, 557, 89, 23);
    		add(btnValider);
     
     
    		System.out.println(c);
    Lorsque je sors de la boucle, il n'y a plus la valeur de c qui a été modifiée avec le bouton.

  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 : 54
    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,

    Je ne sais pas de quelle boucle tu parles, mais le problème vient de (voici ton code, épuré de ce qui n'est pas important pour le sujet en question) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    btnValider.addActionListener(new ActionListener() {
    			public void actionPerformed(ActionEvent e) {
                                    /** ici du code qui affecte une valeur à c (que j'ai enlevé pour qu'on voit mieux ce qui est important) **/
    				System.out.println(c); // affichage 1
    			}
     
    		});
    		add(btnValider);
     
     
    		System.out.println(c); // affichage 2
    Ce que j'ai commenté "// affichage 1" est exécuté juste après avoir déterminer la valeur de c en fonction de l'état (la sélection) des boutons radio. C'est bien la valeur que tu veux parce que ce code s'exécute suite à une action sur le bouton "valider" (clic souris, saisie au clavier, etc). C'est le principe des écouteurs d’événements.
    Seulement ce que j'ai commenté "// affichage 2" s'exécute au moment où ton interface est créé : juste après la création du bouton (new JButton()) et l'affectation de l'écouteur, donc bien avant le déclenchement de l’événement. En fait, on peut même considérer qu'on est pas du tout dans le même temps, un peu comme si on avait des temps parallèles (comme des mondes parallèles). La valeur qu'a c au moment de l'exécution de ce qui est commenté "affichage 2", c'est celle qu'elle a des le début de l'exécution du constructeur de InterfaceGraphique (vu qu'il n'y a aucune modification de c dans ce constructeur jusqu'à cet affichage, donc 0 (la valeur par défaut, affectée à la déclaration).

    Pour exploiter la valeur de c pour faire un traitement, il faut, comme l'a évoqué @Dinobogan, que le code qui le fait soit exécuté après le déclenchement de l'événement. Le plus simple étant dans le code de l'actionListener (et tu n'as pas besoin que c soit variable de classe). Si le but est de faire un dialogue qui permet de choisir une couleur, il faudra prévoir un système qui permet de récupérer la valeur dans le code appelant, après le traitement du choix, donc forcément bloquer le traitement qui affiche le dialogue. Ceci n'est pas simple avec une JFrame : pour le faire simplement, il vaut mieux utiliser un JDialog modale (c'est aussi simple à utiliser qu'une JFrame), et avoir un accesseur pour récupérer la valeur de c.

    Exemple 1 :
    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
    import java.awt.BorderLayout;
    import java.awt.FlowLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
     
    import javax.swing.BoxLayout;
    import javax.swing.ButtonGroup;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JOptionPane;
    import javax.swing.JPanel;
    import javax.swing.JRadioButton;
     
    public class Exemple1 extends JPanel {
     
    	private static final String[] COLORS = {"rouge","vert","orange","rose","gris","bleu"}; 
     
    	public Exemple1() {
    		super(new BorderLayout());
    		JPanel panel = new JPanel();
    		panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
    		ButtonGroup buttonGroup = new ButtonGroup();
    		for(int i=0; i<COLORS.length; i++) {
    			JRadioButton button = new JRadioButton(COLORS[i]);
    			button.setActionCommand(String.valueOf(i));
    			buttonGroup.add(button);
    			panel.add(button);
    		}
    		add(panel);
     
    		JButton valider = new JButton("Valider");
    		valider.addActionListener(new ActionListener() {
     
    			@Override
    			public void actionPerformed(ActionEvent e) {
    				if ( buttonGroup.getSelection()==null ) {
    					JOptionPane.showMessageDialog(Exemple1.this, "Vous n'avez pas choisi de couleur !");
    				}
    				else {
    					int c = Integer.parseInt(buttonGroup.getSelection().getActionCommand());
    					JOptionPane.showMessageDialog(Exemple1.this, "Vous avez choisi la couleur " + COLORS[c]);
    				}
    			} 
     
    		});
    		JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT));
    		buttonPanel.add(valider);
    		add(buttonPanel, BorderLayout.SOUTH);
    	}
     
    	public static void main(String[] args) {
    		JFrame frame = new JFrame("Exemple");
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		frame.add(new Exemple1());
    		frame.pack();
    		frame.setLocationRelativeTo(null);
    		frame.setVisible(true);
    	}
     
    }
    La valeur déterminée en fonction de la sélection dans l'action exécutée par le bouton est traitée à la suite, dans la méthode actionPerformed. Ici, je ne m'embête pas, je stocke l'index dans la commande du bouton, ce qui évite tous ces if que tu fais, mais c'est pareil dans le principe : je pourrais même stocker directement le nom de la couleur dans la commande, mais c'était pour rester au plus proche de ce que tu cherches à faire avec "c".

    Exemple 2 : ici, dans le code principal, on affiche un dialogue modal pour la saisie de la couleur et on récupère la valeur (de c) dans le code principal, après avoir fermer le dialogue modal.
    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
    public class Exemple2 extends JPanel {
     
    	private static final String[] COLORS = {"rouge","vert","orange","rose","gris","bleu"}; 
     
    	int c=-1;
     
    	public Exemple2() {
    		super(new BorderLayout());
    		JPanel panel = new JPanel();
    		panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
    		ButtonGroup buttonGroup = new ButtonGroup();
    		for(int i=0; i<COLORS.length; i++) {
    			JRadioButton button = new JRadioButton(COLORS[i]);
    			button.setActionCommand(String.valueOf(i));
    			buttonGroup.add(button);
    			panel.add(button);
    		}
    		add(panel);
     
    		JButton valider = new JButton("Valider");
    		valider.addActionListener(new ActionListener() {
     
    			@Override
    			public void actionPerformed(ActionEvent e) {
    				if ( buttonGroup.getSelection()!=null ) {
    					c = Integer.parseInt(buttonGroup.getSelection().getActionCommand());
    				}
    				SwingUtilities.getWindowAncestor(Exemple2.this).dispose(); // on ferme la fenêtre
    			} 
     
    		});
    		JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT));
    		buttonPanel.add(valider);
    		add(buttonPanel, BorderLayout.SOUTH);
    	}
     
    	public int getCouleurChoisie() {
    		return c;
    	}
     
    	public static void main(String[] args) {
     
    		JFrame frame = new JFrame("Exemple 2");
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
    		JButton button = new JButton("Choisir couleur");
    		JPanel panel = new JPanel(new GridBagLayout()); // ça c'est juste pour centrer
    		panel.add(button);
    		frame.add(panel);
     
    		button.addActionListener(new ActionListener() {
     
    			@Override
    			public void actionPerformed(ActionEvent e) {
    				int choixCouleur = choisirCouleur(frame);
    				if ( choixCouleur==-1 ) {
    					JOptionPane.showMessageDialog(frame, "Vous n'avez pas choisi de couleur !");
    				}
    				else {
    					JOptionPane.showMessageDialog(frame, "Vous avez choisi la couleur " + COLORS[choixCouleur]);
    				}
    			}
    		});
     
     
    		frame.setSize(300,300);
    		frame.setLocationRelativeTo(null);
    		frame.setVisible(true);
     
    	}
     
    	protected static int choisirCouleur(JFrame owner) {
    		JDialog dialog = new JDialog(owner, true); // un dialogue modal, donc qui va bloquer l'exécution tant qu'on le ferme pas
    		Exemple2 exemple2 = new Exemple2();
    		dialog.add(exemple2);
    		dialog.pack();
    		dialog.setLocationRelativeTo(null);
    		dialog.setVisible(true); // ici le code est bloqué tant que le dialogue est visible, donc la ligne suivant sera exécuté après cette fermeture
    		return exemple2.getCouleurChoisie(); // on retourne la couleur choisie au code appelant (exécuté par l'action listener du bouton de la fenêtre principale)
    	}
     
    }
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

Discussions similaires

  1. [glade] Récupération d'une valeur dans une combo
    Par Poutchjay dans le forum GTK+ avec Python
    Réponses: 1
    Dernier message: 23/01/2006, 14h59
  2. Réponses: 6
    Dernier message: 05/01/2006, 16h37
  3. [XSL] récupération d'une valeur
    Par Mike35 dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 14/12/2005, 15h58
  4. Réponses: 2
    Dernier message: 03/11/2005, 15h03
  5. récupération d'une valeur dans une variable
    Par jh0483 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 17/08/2005, 09h49

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