Partage
  • Partager sur Facebook
  • Partager sur Twitter

{{Titre incorrect}} JRadioButton + MouseEvent ?

4 février 2010 à 21:04:57

Bonjour à tous !

Voilà, je suis face à un problème qui m'embête parce qu'il ne me semble pas ci difficile :p

C'est simple : je conçoit une IHM dans laquelle j'aurais besoin de cocher (ou décocher) des JRadioButton simplement au passage de la souris dessus...

Pour le moment j'essaye ça :

public SelectPanel() {
            this.setLayout(new GridLayout(8, 2));

            for(int i=0;i<8;i++) {
                jr[i] = new JRadioButton();
                jr[i].addMouseListener(new MouseListener() {

                    public void mouseClicked(MouseEvent e){}

                    public void mousePressed(MouseEvent e){}

                    public void mouseReleased(MouseEvent e){}

                    public void mouseEntered(MouseEvent e){}

                    public void mouseExited(MouseEvent e){}
                });
                this.add(jr[i]);
            }
}


C'est en fait le constructeur d'un JPanel qui contient 8 JRadioButton.

Je ne sais pas si je suis sur la bonne voie ni si c'est possible... Merci pour la suite ;)

  • Partager sur Facebook
  • Partager sur Twitter
5 février 2010 à 10:49:51

C'est un peu brouillon cette façon de faire. Crée une classe privée qui implémente MouseListener déjà. Tu peux créer un constructeur pour plus de facilité prenant jr[i] en argument, et qui le garde en attribut, comme ça tu peux facilement récupérer le bon JRadioButton à cocher. Sinon il y a getSource mais je n'aime pas cette méthode, alors utilise l'autre :D.

Après ça regarde dans la javadoc. Je pense qu'il n'existe pas de méthode dans la classe JRadioButton pour cocher décocher, mais dans ces classes mères j'ai trouvé setSelected et isSelected que tu pourrais utiliser, je te laisse essayer. Pour plus de simplicité et si tu ne veux pas devoir traiter les cas, il existe la méthode doClick qui pourrait t'être utile. Donc dans la méthode mouseEntered tu auras un truc du genre.
this.radioButton.doClick();//non testé, pas de garantie en cas de combustion spontanée

si l'attribut dans lequel tu as stocké jr[i] est radioButton.

Si tu n'y arrives vraiment pas n'hésite pas à demander.
  • Partager sur Facebook
  • Partager sur Twitter
5 février 2010 à 14:50:00

Merci Pyros j'y suis presque cependant un problème persiste...

Voilà mon code :

private class SelectPanel extends JPanel {

        private JRadioButton[] jr = new JRadioButton[8];

        public SelectPanel() {
            this.setLayout(new GridLayout(8, 2));

            for(int i=0;i<8;i++) {
                jr[i] = new JRadioButton();
                jr[i].addMouseListener(new MyRadioListener(jr[i]));
                this.add(jr[i]);
            }
        }

        private class MyRadioListener implements MouseListener {

            private JRadioButton jr = new JRadioButton();
            
            public MyRadioListener(JRadioButton new_jr) {
                this.jr = new_jr;
            }


            public void mouseEntered(MouseEvent e) {

                if(!jr.isSelected())
                    this.jr.setSelected(true);
                else
                    this.jr.setSelected(false);
            }
            public void mouseExited(MouseEvent e){}
            public void mouseClicked(MouseEvent e){}
            public void mousePressed(MouseEvent e){}
            public void mouseReleased(MouseEvent e){}
        }
    }


Pour l'instant les "JRadioButton" changent de valeur à chaque fois que le pointeur passe dessus.
J'aurais voulu effectuer la même opération mais seulement lorsque le click gauche est enfoncé.

J'ai essayé plusieurs chose comme ceci :

private class MyRadioListener implements MouseListener {

            private JRadioButton jr = new JRadioButton();
            private boolean click = false;
            
            public MyRadioListener(JRadioButton new_jr) {
                this.jr = new_jr;
            }


            public void mouseEntered(MouseEvent e) {

                if(click) {
                      if(!jr.isSelected())
                           this.jr.setSelected(true);
                       else
                           this.jr.setSelected(false);
                }
            }
            public void mouseExited(MouseEvent e){
                 click = false;
            }
            public void mouseClicked(MouseEvent e){}
            public void mousePressed(MouseEvent e){
                 click = true;
            }
            public void mouseReleased(MouseEvent e){}
}


Mais j'ai l'impression de le click de la souris est bloquant ...
Dans le même genre, j'ai implémenté KeyListener pour remplacer le click par une touche clavier (CTRL par exemple) et là non plus, rien de se passe :euh:

Une idée ?? :-°
  • Partager sur Facebook
  • Partager sur Twitter
5 février 2010 à 14:57:35

Faut revoir ton système de boolean avec ta variable click.
mousePressed() est appelée après mouseEntered() si je me souviens bien (à vérifier).
Pour vérifier, laisse toujours click à true, normalement le code de mouseEntered() devrait marcher.
  • Partager sur Facebook
  • Partager sur Twitter
5 février 2010 à 15:13:44

(Désolé de poster autant de fois le même code...)

private class MyRadioListener implements MouseListener {

    private JRadioButton jr = new JRadioButton();
    private boolean click = false;

    public MyRadioListener(JRadioButton new_jr) {
        this.jr = new_jr;
    }

    public void mousePressed(MouseEvent e) {
        click = true;
    }

    public void mouseReleased(MouseEvent e) {
        click = false;
    }

    public void mouseEntered(MouseEvent e) {

        if(click) {

            if(!jr.isSelected())
                this.jr.setSelected(true);
            else
                this.jr.setSelected(false);
        }
    }
    public void mouseClicked(MouseEvent e){}
    public void mouseExited(MouseEvent e) {}
}


Je me rapproche :lol: Il se passe exactement l'action que je veux mais seulement sur le JRadio sur lequel j'ai cliqué en premier !

J'imagine que le listener "ne change pas" de JRadio tout seul ...
  • Partager sur Facebook
  • Partager sur Twitter
5 février 2010 à 15:13:44

Le message qui suit est une réponse automatique activée par un modérateur.
Les réponses automatiques permettent d'éviter aux modérateurs d'avoir à répéter de nombreuses fois la même chose, et donc de leur faire gagner beaucoup de temps.
Nous sommes néanmoins ouverts et si vous avez une question ou une remarque, n'hésitez pas à contacter le modérateur en question par MP.


Le titre du sujet est incorrect


Bonjour,



Ce sujet a un titre qui ne décrit pas correctement le sujet, ou le titre est en majuscules. Vous pouvez re-poster votre sujet en rectifiant ce point.

Voici quelques correspondances pour vous aider à choisir au mieux votre titre :



Merci de votre compréhension :)
Les modérateurs.
  • Partager sur Facebook
  • Partager sur Twitter