web-dev-qa-db-fra.com

JCheckbox - ActionListener et ItemListener?

ActionListener et ItemListener sont tous deux 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'eux est préféré à l'autre?

57
TU_HEO DAKAI

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

54
NiranjanBhat

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

Par exemple, si JCheckBox c1 _ (par exemple) est ajouté à un ButtonGroup. Changer l'état d'autres JCheckBoxes dans ButtonGroup ne déclenchera pas un ActionEvent sur d'autres JCheckBox, mais un ItemEvent sera déclenché.

Derniers mots: Un ItemEvent est déclenché même lorsque l'utilisateur désélectionne une case à cocher en sélectionnant un autre JCheckBox (lorsque vous êtes dans un ButtonGroup), cependant ActionEvent n'est pas généré comme cela à la place ActionEvent n'écoute que si une action est effectuée sur le JCheckBox (pour lequel le ActionListener est enregistré uniquement) ou non. Il ne connaît pas ButtonGroup ni tous les autres éléments de sélection/désélection.

24
JavaTechnical

Pour référence, voici un sscce qui illustre la différence. Console:

 SELECTIONNEE 
 ACTION_PERFORMED 
 DESELECTIONNEE 
 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();
            }
        });
    }
}
20
trashgod

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

3
mario go

Je l'ai testé moi-même et j'ai examiné toutes les réponses à ce message. Je ne pense pas qu'ils répondent très bien à cette question. Je me suis expérimenté afin d'obtenir une bonne réponse (code ci-dessous). Vous POUVEZ déclencher l'un ou l'autre événement avec ActionListener et 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 que je suppose, puisqu'il s'agit du type Object. La SEULE différence que je peux dire entre ces deux écouteurs est le type d'objet d'événement renvoyé avec l'auditeur qui est différent. ET vous obtenez un meilleur type d'événement avec une case à cocher utilisant un ItemListener, par opposition à un ActionListener.

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

Le code ci-dessous configure un JPanel simple avec JRadioButtons, JCheckBoxes et un affichage JLabel qui change en fonction de la configuration des boutons. Je règle tous les boutons radio et cases à cocher avec un écouteur d'action et un écouteur d'élément. Ensuite, j'ai écrit les classes d'écoute ci-dessous avec ActionListener entièrement commenté, car je l'ai d'abord testé dans cette expérience. Vous remarquerez que si vous ajoutez ce panneau à un cadre et à un affichage, tous les boutons radio et toutes les cases à cocher se déclenchent toujours, quel que soit le type d'écouteur.

Le type de retour dans les méthodes implémentées est la principale différence entre les deux. Les deux auditeurs déclenchent les événements de la même manière. La raison pour laquelle une case à cocher doit utiliser ItemListener plutôt que ActionListener est expliquée un peu mieux dans le commentaire ci-dessus en raison du type d'événement 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);
            }

        }

    }
}
1
maximusg