Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème classe interne

    11 février 2012 à 14:59:13

    Bonjour à tous,

    Je me suis lancé dans l'écriture d'un petit programme semblable à celui de cysboy dans son le chapitre de son tutoriel sur les interactions bouton-application. Le programme consiste tout simplement à compter le nombre de fois qu'on clique sur un bouton.
    Voici le code:
    public class Fenetre extends JFrame{
     
           
           private JButton bouton1= new JButton("1"); 
           int compteur=0;
          public JPanel container = new JPanel();
           protected JLabel text=new JLabel("");
    	  
        
          
    	   public Fenetre(){
            	this.setBackground(Color.white);
                this.setLayout(new BorderLayout());
                
            	this.add(text, BorderLayout.NORTH);
                    this.setTitle("Bouton");
                    this.setSize(500, 500);
                    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    this.setLocationRelativeTo(null);
                    
                    this.setLayout(new GridLayout(10, 10));
                    bouton1.addActionListener(new bouton1Listener());
          
                    
                    this.getContentPane().add(bouton1);
                    
                    text.setHorizontalAlignment(JLabel.CENTER);
                    
                    
                    
                    text.setText(""+compteur);
                    this.setVisible(true);
                }   
                             
          
    	        public class bouton1Listener implements ActionListener {
    
            	
    
    			@Override
            	public void actionPerformed(ActionEvent e) {
            		
                               compteur++; }}
    }
    


    Quand j’exécute le programme, text.setText(""+compteur) affiche toujours zéro.
    Je ne comprends pas pourquoi la manipulation faites dans ma classe interne bouton1Listener (c'est à dire compteur++) n'est pas prise en compte.
    Comment dois-je faire?
    Merci d'avance pour vos réponses !!!
    • Partager sur Facebook
    • Partager sur Twitter
      11 février 2012 à 15:13:56

      Faut aussi remettre à jour le JLabel... là tu changes juste la valeur de compteur.
      • Partager sur Facebook
      • Partager sur Twitter
      Je ne réponds pas aux MP techniques, les forums sont là pour ça / Danser le rock à Lille / BetaSeries
        11 février 2012 à 15:16:20

        @Naked Snake

        Merci de ta réponse, mais comment fais-tu pour remettre à jour le JLabel ???
        • Partager sur Facebook
        • Partager sur Twitter
          11 février 2012 à 15:27:36

          Comme tu as fais dans le constructeur...
          • Partager sur Facebook
          • Partager sur Twitter
          Je ne réponds pas aux MP techniques, les forums sont là pour ça / Danser le rock à Lille / BetaSeries
            11 février 2012 à 15:52:12

            Désolé mais la je sèche vraiment. Dans le constructeur, le seule moment où je manipule le JLablel, c'est pour lui assigner une valeur (compteur). Et je ne peux pas mettre un text.setText() dans ma classe interne.
            Je vois vraiment pas comment faire là...
            • Partager sur Facebook
            • Partager sur Twitter
              11 février 2012 à 16:36:22

              Bien sûr que si... j'ai fait le test à l'instant.

              Par contre je trouve bizarre de faire une classe interne pour un listener, en général, c'est plutôt des classes anonymes.
              • Partager sur Facebook
              • Partager sur Twitter
              Je ne réponds pas aux MP techniques, les forums sont là pour ça / Danser le rock à Lille / BetaSeries
              Anonyme
                11 février 2012 à 17:02:26

                Citation : Naked Snake

                Par contre je trouve bizarre de faire une classe interne pour un listener, en général, c'est plutôt des classe anonymes.



                Ca arrive, par exemple si le listener doit recevoir des infos depuis une autre classe alors il faut une référence à transmettre, egalement dans le cas ou le listener a pas mal de code, pour gagner en lisibilité, vaut mieux passer par une classe interne.
                Un dernier cas, lorsque que le listener doit être abstrait, on peut faire une classe abstraite interne et une implémentation en dehors.
                • Partager sur Facebook
                • Partager sur Twitter
                  11 février 2012 à 17:19:43

                  Citation : Naked Snake

                  Bien sûr que si... j'ai fait le test à l'instant.



                  Oui je sais que ça marche, mais le code que je vous ai présenté n'est qu'un fragment d'un plus grand code où il y a plusieurs boutons et où je ne peux vraiment pas mettre un .setText dans une classe interne.
                  • Partager sur Facebook
                  • Partager sur Twitter
                    11 février 2012 à 17:27:33

                    Citation : shakhal

                    Citation : Naked Snake

                    Par contre je trouve bizarre de faire une classe interne pour un listener, en général, c'est plutôt des classe anonymes.



                    Ca arrive, par exemple si le listener doit recevoir des infos depuis une autre classe alors il faut une référence à transmettre, egalement dans le cas ou le listener a pas mal de code, pour gagner en lisibilité, vaut mieux passer par une classe interne.
                    Un dernier cas, lorsque que le listener doit être abstrait, on peut faire une classe abstraite interne et une implémentation en dehors.



                    En fait, je parlais de son cas, vu qu'il n'y a qu'une ligne de code dans son listener.

                    Ça m'est arrivé de faire des classe non anonymes pour des listener, mais c'est pas plus de 5% des cas je dirai.

                    Citation : LiquidNitrogen

                    Citation : Naked Snake

                    Bien sûr que si... j'ai fait le test à l'instant.



                    Oui je sais que ça marche, mais le code que je vous ai présenté n'est qu'un fragment d'un plus grand code où il y a plusieurs boutons et où je ne peux vraiment pas mettre un .setText dans une classe interne.



                    Faut que tu bidouille ta classe interne : genre tu rajoutes un constructeur qui prend en paramètre le bouton à modifier. Ou tu fait un appel à une fonction de la classe englobante. Enfin, sans plus d'indication, on va avoir du mal à t'aider...
                    • Partager sur Facebook
                    • Partager sur Twitter
                    Je ne réponds pas aux MP techniques, les forums sont là pour ça / Danser le rock à Lille / BetaSeries
                      12 février 2012 à 15:06:25

                      Au pire tu peux ajouter un final sur le JLabel

                      final protected JLabel text=new JLabel("");
                      


                      Comme ça tu peux faire ça :


                      public void actionPerformed(ActionEvent e) {
                              		
                                                 compteur++;
                                                 text.setText(String.valueOf(compteur));
                       }
                      


                      edit : apres je debute en interface graphique java donc c'est peut etre bon mais sale comme solution
                      • Partager sur Facebook
                      • Partager sur Twitter

                      Problème classe interne

                      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                      • Editeur
                      • Markdown