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 :

Problème d'accès à un objet dans Listener


Sujet :

Java

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2019
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Transports

    Informations forums :
    Inscription : Octobre 2019
    Messages : 4
    Points : 5
    Points
    5
    Par défaut Problème d'accès à un objet dans Listener
    Bonjour à toutes et à tous,

    Voilà, dans le but d'un petit projet perso je tente de développer une interface en JAVA.
    Je suis totalement débutant et donc je me doute que j'ai énormément à apprendre et je n'attends que ça.

    J'utilise Eclipse en java jdk 1.8 avec des composants swing pour l'interface.

    J'essaye de modifier le texte d'un ToggleButton en fonction de son état, mais je bloque : je n'arrive pas à accéder à mon bouton dans le listener.

    Ne sachant pas d'où vient le problème, je suis incapable de trouver une solution sur le net. Je pense ne pas avoir bien compris le principe de methode/class et les héritages.

    Merci d'avance pour votre aide.

    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
    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
     
     
    import java.awt.BorderLayout;
    import java.awt.GridLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ItemEvent;
    import java.awt.event.ItemListener;
     
    import javax.swing.ButtonGroup;
    import javax.swing.ImageIcon;
    import javax.swing.JFrame;
    import javax.swing.JMenu;
    import javax.swing.JMenuBar;
    import javax.swing.JMenuItem;
    import javax.swing.JPanel;
    import javax.swing.JRadioButton;
    import javax.swing.JTextField;
    import javax.swing.JToggleButton;
    import javax.swing.UIManager;
    import javax.swing.border.EmptyBorder;
     
     
     
    public class hercule002 extends JFrame {
     
    	boolean test = false;
     
    	private static final long serialVersionUID = -3662563343892011625L;
    	private JPanel contentPane;
    	private JTextField txtEditMe;
     
    	/** Fonction principale **/
    	public static void main(String[] args) throws Exception {
    		// Apply a look'n feel
            UIManager.setLookAndFeel( UIManager.getSystemLookAndFeelClassName() );
     
            // Start my window
            hercule002 myWindow = new hercule002();
            myWindow.setVisible( true );
    	}
     
    	/* Création de la fenêtre */
    	public hercule002() {
     
    		super("Hercule");
    		setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    		setSize(720, 480);
    		setLocationRelativeTo( null );
     
    		contentPane = new JPanel();
    		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
    		setContentPane(contentPane);
    		contentPane.setLayout(new BorderLayout());
     
    		JToggleButton toggleButton = new JToggleButton("Click Me");
    		ItemListener itemListener = new ItemListener() {
    		    public void itemStateChanged(ItemEvent itemEvent) {
    		        int state = itemEvent.getStateChange();
    		        if (state == ItemEvent.SELECTED) {
    		            System.out.println("Selected"); // show your message here
    		        } else {
    		            System.out.println("Deselected"); // remove your message
    		        }
    		    }
    		};
    		toggleButton.addItemListener(itemListener);
     
    		contentPane.add(westComponent(), BorderLayout.WEST);
     
    		setJMenuBar( this.createMenuBar() );
     
    		txtEditMe = new JTextField();
    		txtEditMe.setText("Edit me !");
    		contentPane.add(txtEditMe);
    		txtEditMe.setColumns(10);
    	}
     
    	/* Methode de création des boutons */
    	public JPanel westComponent() {
     
    		JPanel panel = new JPanel();
     
    		panel.setLayout(new GridLayout(0,1,10,30));
     
    		JToggleButton btnActRegul = new JToggleButton("Régulation OFF");
    		btnActRegul.addActionListener((e) -> btnActRegulListener(e) );
    		panel.add(btnActRegul);
     
    		ButtonGroup groupRegul = new ButtonGroup();
    		JRadioButton btnFreewheel = new JRadioButton("Free-wheel", true);
    		groupRegul.add(btnFreewheel);
    	    panel.add(btnFreewheel);
    		JRadioButton btnCouple = new JRadioButton("Régulation couple");
    		groupRegul.add(btnCouple);
    	    panel.add(btnCouple);
    	    JRadioButton btnRegime = new JRadioButton("Régulation régime");
    	    groupRegul.add(btnRegime);
    	    panel.add(btnRegime);
     
    		JToggleButton chckbxVentilation = new JToggleButton("Ventilation");
    		panel.add(chckbxVentilation);
     
    		return panel;
    	}
     
    	private void btnActRegulListener( ActionEvent e) {
    		test =! test;
    		if ( test == true) btnActRegul.setText("Régulation ON");
    		else btnActRegul.setText("Régulation OFF");
    		System.out.println(test);
    	}
     
     
     
    	/* Methode de construction de la barre de menu */
        private JMenuBar createMenuBar() {
     
            // La barre de menu à proprement parler
            JMenuBar menuBar = new JMenuBar();
     
            // Définition du menu déroulant "File" et de son contenu
            JMenu mnuSettings = new JMenu( "Réglages" );
            mnuSettings.setMnemonic( 'R' );
    	        JMenuItem mnuCommunication = new JMenuItem( "Communication série" );
    	        mnuCommunication.setIcon( new ImageIcon( "icons/communication.png" ) );
    	        mnuSettings.add(mnuCommunication);
            menuBar.add(mnuSettings);
     
            // Définition du menu déroulant "Help" et de son contenu
            JMenu mnuHelp = new JMenu( "Aide" );
            mnuHelp.setMnemonic( 'A' );
    	        JMenuItem mnuUtilisation = new JMenuItem( "Utilisation" );
    	        mnuUtilisation.setIcon( new ImageIcon( "icons/utilisation.png" ) );
    	        mnuHelp.add(mnuUtilisation);
    	        JMenuItem mnuParametrage = new JMenuItem( "Paramétrage" );
    	        mnuParametrage.setIcon( new ImageIcon( "icons/parametre.png" ) );
    	        mnuHelp.add(mnuParametrage);
            menuBar.add(mnuHelp);
     
            return menuBar;
        }
     
    }

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 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

    1. comme le bouton et la méthode "appartiennent" à la même classe, tu pourrais déclarer btnActRegul comme attribut, comme tu as fais pour le JTextField txtEditMe. L'attribut btnActRegul serait accessible depuis la méthode btnActRegulListener. Seulement, attention la méthode westComponent est public donc on pourrait l’appeler un peu comme on veut et foutre le bazar alors qu'elle ne devrait être appelée qu'une fois, par "hercule002", au moment de la construction du "hercule002", et donc être private.
    2. on peut toujours passer la référence du bouton à méthode btnActRegulListener (en adaptant bien sûr la signature de cette méthode), ce qui permettrait de faire ce qu'on veut avec ce qu'elle réprésente (le bouton donc) dans la méthode :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      btnActRegul.addActionListener((e) -> btnActRegulListener(e,btnActRegul) );
      D'ailleurs à la limite, l’événement, tu t'en sers pas, donc tu pourrais carrément le vire des paramètres de la méthode.
    3. On peut toujours accèder au composant qui a produit l'évenement via l'évenement. C'est ce qu'on appelle la source. Si l'écouteur n'est pas utilisé par plusieurs composants graphiques, c'est assez simple :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      private void btnActRegulListener( ActionEvent e) {
      	JButton btnActRegul = (JButton)(e.getSource());
      	test =! test;
      	if ( test == true) btnActRegul.setText("Régulation ON");
      	else btnActRegul.setText("Régulation OFF");
      	System.out.println(test);
      }
      Ce n'est pas beaucoup plus compliqué si l'écouteur est utilisé par plusieurs composants, puisqu'il suffit de tester (la classe par exemple, un id...), mais c'est plus propre et plus simple de passer par la commande (voir méthode JButton.setActionCommand(String) et ActionEvent.getActionCommand(String) ), ce qui permet de découpler les composants graphiques et les actions.
    4. Il vaut mieux gérer les actions et la partie purement affichage séparément. Il vaut mieux utiliser les facultés internes des composants (comme la propriété "selected" du ToggleButton, que de gérer un attribut booléen à part (ce que tu fais avec test). Et pas le mêler à l'idée de clic ou d'action (ce ne sont pas les seuls moyens de modifier l'état sélectionné du 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
      public class DemoToggleButton {
       
      	private static final String TEXT = "Off";
      	private static final String TEXT_SELECTED  = "On";
       
      	public static void main(String[] args) {
       
      		JFrame frame = new JFrame();
      		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
       
      		JPanel panel = new JPanel(new GridBagLayout()); // gridbaglayout juste pour centrer
       
      		JToggleButton button = new JToggleButton();
      		button.addItemListener(e-> button.setText(e.getStateChange()==ItemEvent.SELECTED?TEXT_SELECTED:TEXT));
       
      		button.setSelected(true);
      		button.addItemListener(e-> System.out.println(e.getStateChange()==ItemEvent.SELECTED?"En bas":"En haut"));
       
      		panel.add(button);
       
      		frame.add(panel);
      		frame.setSize(600, 400);
      		frame.setLocationRelativeTo(null);
      		frame.setVisible(true);
       
      	}
       
      }
      On peut déplorer l'inexistence d'une ToggleAction en Swing, mais on pourrait en faire une qui encapsule toute la logique
    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.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2019
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Transports

    Informations forums :
    Inscription : Octobre 2019
    Messages : 4
    Points : 5
    Points
    5
    Par défaut
    Salut

    Merci pour le coup de main, cela m'a énormément aidé à comprendre plusieurs principe en m'aiguillant parfaitement.
    J'ai ainsi pu avancer.

    Bonne fin de journée.

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 23/03/2012, 15h41
  2. Réponses: 3
    Dernier message: 18/05/2007, 16h03
  3. Problème d'accès à un vector dans un vector
    Par Petzouille57 dans le forum Collection et Stream
    Réponses: 4
    Dernier message: 18/05/2007, 10h28
  4. Acces aux objets dans un sous-formulaire
    Par Destiny dans le forum Access
    Réponses: 3
    Dernier message: 13/02/2007, 08h28
  5. Problème d'accès à un objet!
    Par chrono23 dans le forum C++
    Réponses: 21
    Dernier message: 26/06/2006, 20h21

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