62 votes

JCheckbox - ActionListener et ItemListener ?

Les deux ActionListener et ItemListener sont utilisés pour déclencher un événement avec JCheckBox ?

Alors, quelle est la différence entre eux et dans quel cas l'un d'entre eux est préféré à l'autre ?

65voto

NiranjanBhat Points 971

Les deux sites ItemListener ainsi que ActionListener en cas de JCheckBox ont le même comportement. Cependant, la différence majeure est ItemListener peut être déclenché en appelant la setSelected(true) sur la case à cocher. En tant que pratique de codage, n'enregistrez pas les deux ItemListener ainsi que ActionListener avec le JCheckBox afin d'éviter toute incohérence.

0 votes

Il semble que j'ai trouvé une autre différence où un utilisateur signale un ActionListener no est déclenché lorsqu'il clique sur la case à cocher, mais lorsque l'utilisateur change le code en ItemListener, l'événement se déclenche. Ainsi, le déclenchement de l'actionPerformed peut dépendre de la L&F ou de quelque chose d'autre.

0 votes

"L'ItemListener peut être déclenché en appelant le setSelected(true) sur la case à cocher". C'est très utile de le savoir ! Cela est-il documenté quelque part ou l'avez-vous découvert ?

27voto

JavaTechnical Points 1164

La différence est que ActionEvent est déclenché lorsque l'action est exécutée sur le JCheckBox c'est-à-dire que son état est modifié soit en cliquant dessus avec la souris, soit avec une barre d'espacement ou un mnémonique. Il ne vraiment écouter les événements de changement, que ce soit le JCheckBox est sélectionné ou désélectionné.

Par exemple, si JCheckBox c1 (say) est ajouté à un ButtonGroup . Changer l'état des autres JCheckBoxes dans le ButtonGroup ne tirera pas un ActionEvent sur d'autres JCheckBox au lieu d'un ItemEvent est tiré.

Derniers mots : Un site ItemEvent est déclenché même si l'utilisateur désélectionne une case à cocher en sélectionnant une autre case. JCheckBox (lorsque dans un ButtonGroup ), mais ActionEvent n'est pas généré de cette façon mais plutôt ActionEvent n'écoute que si une action est effectuée sur l'objet JCheckBox (à laquelle l ActionListener est enregistrée uniquement) ou non. Il ne connaît pas ButtonGroup et tous les autres trucs de sélection/désélection.

22voto

trashgod Points 136305

À titre de référence, voici un sscce qui illustre la différence. Console :

SELECTED
ACTION\_PERFORMED
DESELECTED
ACTION\_PERFORMED

Code :

import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JPanel;

/** @see http://stackoverflow.com/q/9882845/230513 */
public class Listeners {

    private void display() {
        JFrame f = new JFrame("Listeners");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JCheckBox b = new JCheckBox("JCheckBox");
        b.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                System.out.println(e.getID() == ActionEvent.ACTION_PERFORMED
                    ? "ACTION_PERFORMED" : e.getID());
            }
        });
        b.addItemListener(new ItemListener() {

            @Override
            public void itemStateChanged(ItemEvent e) {
                System.out.println(e.getStateChange() == ItemEvent.SELECTED
                    ? "SELECTED" : "DESELECTED");
            }
        });
        JPanel p = new JPanel();
        p.add(b);
        f.add(p);
        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                new Listeners().display();
            }
        });
    }
}

3voto

mario go Points 94

J'utilise addActionListener pour les JButtons tandis que addItemListener est plus pratique pour un JToggleButton . Avec if(event.getStateChange()==ItemEvent.SELECTED) Dans ce dernier cas, j'ajoute des événements pour chaque fois que le bouton JToggleButton est coché/décoché.

1voto

maximusg Points 123

Je l'ai testé moi-même, et en regardant toutes les réponses sur ce post, je ne pense pas qu'elles répondent très bien à cette question. J'ai expérimenté moi-même afin d'obtenir une bonne réponse (code ci-dessous). Vous POUVEZ déclencher l'un ou l'autre événement avec l'ActionListener et l'ItemListener 100% du temps lorsqu'un état est modifié dans un bouton radio ou une case à cocher, ou tout autre type d'élément Swing, je suppose puisqu'il est de type Object. La SEULE différence que je peux voir entre ces deux écouteurs est le type d'objet d'événement qui est renvoyé avec l'écouteur est différent. ET vous obtenez un meilleur type d'événement avec une case à cocher en utilisant un ItemListener plutôt qu'un ActionListener.

Les types de retour d'un ActionEvent et d'un ItemEvent auront différentes méthodes stockées qui peuvent être utilisées lorsqu'un type d'événement est déclenché. Dans le code ci-dessous, les commentaires montrent la différence dans les méthodes .get pour chaque type d'événement retourné par la classe.

Le code ci-dessous configure un simple JPanel avec JRadioButtons, JCheckBoxes, et un affichage JLabel qui change en fonction de la configuration des boutons. J'ai configuré tous les RadioButtons et CheckBoxes avec un Action Listener et un Item Listener. Puis j'ai écrit les classes de Listener ci-dessous avec ActionListener entièrement commenté parce que je l'ai testé en premier dans cette expérience. Vous remarquerez que si vous ajoutez ce panneau à un cadre et que vous l'affichez, tous les boutons radio et les cases à cocher se déclenchent toujours, quel que soit le type de Listener. Il suffit de commenter les méthodes de l'un et d'essayer l'autre et vice versa.

Le type de retour dans les méthodes mises en œuvre est la PRINCIPALE différence entre les deux. Les deux récepteurs déclenchent les événements de la même manière. La raison pour laquelle une case à cocher doit utiliser un ItemListener plutôt qu'un ActionListener est expliquée un peu mieux dans le commentaire ci-dessus, en raison du type d'événement qui est renvoyé.

package EventHandledClasses;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class RadioButtonsAndCheckBoxesTest extends JPanel{
JLabel display;
String funny, serious, political;
JCheckBox bold,italic;
JRadioButton funnyQuote, seriousQuote, politicalQuote;
ButtonGroup quotes;

    public RadioButtonsAndCheckBoxesTest(){
        funny = "You are not ugly, you were just born... different";
        serious = "Recommend powdered soap in prison!";
        political = "Trump can eat a little Bernie, but will choke on his     Birdie";

        display = new JLabel(funny);
        Font defaultFont = new Font("Ariel",Font.PLAIN,20);
        display.setFont(defaultFont);

        bold = new JCheckBox("Bold",false);
        bold.setOpaque(false);
        italic = new JCheckBox("Italic",false);
        italic.setOpaque(false);

        //Color itemBackground =

        funnyQuote = new JRadioButton("Funny",true);
        funnyQuote.setOpaque(false);
        seriousQuote = new JRadioButton("Serious");
        seriousQuote.setOpaque(false);
        politicalQuote = new JRadioButton("Political");
        politicalQuote.setOpaque(false);

        quotes = new ButtonGroup();
        quotes.add(funnyQuote);
        quotes.add(seriousQuote);
        quotes.add(politicalQuote);

        JPanel primary = new JPanel();
        primary.setPreferredSize(new Dimension(550, 100));

        Dimension standard = new Dimension(500, 30);

        JPanel radioButtonsPanel = new JPanel();
        radioButtonsPanel.setPreferredSize(standard);
        radioButtonsPanel.setBackground(Color.green);
        radioButtonsPanel.add(funnyQuote);
        radioButtonsPanel.add(seriousQuote);
        radioButtonsPanel.add(politicalQuote);

        JPanel checkBoxPanel = new JPanel();
        checkBoxPanel.setPreferredSize(standard);
        checkBoxPanel.setBackground(Color.green);
        checkBoxPanel.add(bold);
        checkBoxPanel.add(italic);

        primary.add(display);
        primary.add(radioButtonsPanel);
        primary.add(checkBoxPanel);

        //Add Action Listener To test Radio Buttons
        funnyQuote.addActionListener(new ActionListen());
        seriousQuote.addActionListener(new ActionListen());
        politicalQuote.addActionListener(new ActionListen());

        //Add Item Listener to test Radio Buttons
        funnyQuote.addItemListener(new ItemListen());
        seriousQuote.addItemListener(new ItemListen());
        politicalQuote.addItemListener(new ItemListen());

        //Add Action Listener to test Check Boxes
        bold.addActionListener(new ActionListen());
        italic.addActionListener(new ActionListen());

        //Add Item Listener to test Check Boxes
        bold.addItemListener(new ItemListen());
        italic.addItemListener(new ItemListen());

        //adds primary JPanel to this JPanel Object
        add(primary);   
    }

    private class ActionListen implements ActionListener{

        public void actionPerformed(ActionEvent e) {

         /*
         Different Get Methods from  ItemEvent 
         e.getWhen()
         e.getModifiers()
         e.getActionCommand()*/

            /*int font=Font.PLAIN;
            if(bold.isSelected()){
                font += Font.BOLD;
            }
            if(italic.isSelected()){
                font += Font.ITALIC;
            }
            display.setFont(new Font("Ariel",font,20));

            if(funnyQuote.isSelected()){
                display.setText(funny);
            }
            if(seriousQuote.isSelected()){
                display.setText(serious);
            }
            if(politicalQuote.isSelected()){
                display.setText(political);
            }*/
        }
    }
    private class ItemListen implements ItemListener {

        public void itemStateChanged(ItemEvent arg0) {

            /*
            Different Get Methods from ActionEvent
            arg0.getItemSelectable()
            arg0.getStateChange()
            arg0.getItem()*/

            int font=Font.PLAIN;
            if(bold.isSelected()){
                font += Font.BOLD;
            }
            if(italic.isSelected()){
                font += Font.ITALIC;
            }
            display.setFont(new Font("Ariel",font,20));

            if(funnyQuote.isSelected()){
                display.setText(funny);
            }
            if(seriousQuote.isSelected()){
                display.setText(serious);
            }
            if(politicalQuote.isSelected()){
                display.setText(political);
            }

        }

    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X